ERRORLEVEL não atualiza os blocos de controle internos, como as instruções IF, a menos que você use! ERRORLEVEL! em vez de% ERRORLEVEL% e use este comando no início do seu código: setlocal ENABLEDELAYEDEXPANSION
consulte o link
Eu estou tentando gravar uma sub-rotina em lote para determinar se um computador tem o Deep Freeze instalado ou está descongelado com segurança. (Para quem não sabe, Deep Freeze é um programa que é comumente usado para reverter impedir e fazer alterações no disco em um sistema operacional.) dfc.exe é um arquivo que congelamento profundo instala que pode ser usado para determinar. Ele retorna 0 se descongelado, ou 1 se congelado
Basicamente, eu estava pensando que é inútil executar scripts que instalem certas coisas se o computador estiver congelado. Primeiro eu verifico se o dfc.exe está instalado, então tento verificar se há estado descongelado / congelado, mas o problema é que, por alguma razão, o valor de retorno do dfc não parece atualizar para onde eu verifico errorlevel na segunda vez.
Alguém sabe por que não consigo ver o valor de retorno da segunda verificação de ErrorLevel ( on line 41 ) Eu incluí o código abaixo também.
EDIT: Adicionado Psuedocode para o meu processo de pensamento antes do código.
::Point1
IF Dfc.exe is present then (
::Point2
If "dfc get /ISFROZEN" returns FROZEN then (
::Point3
Write out to file so we can know that something was skipped,
goto EOF to close out of script and avoid wasting cycles installing
)
::Point4
::Deep freeze is installed, but thawed or it would have gotten caught in the "FROZEN" IF
::Fall through out of outer IF without running anything else
)
::Point5
GOTO (Return to where we left to check if we were wasting time with a label)
Código abaixo aqui
@ECHO Off
::CheckForDF here
ECHO We will now test for DeepFreeze ether not installed or is thawed
Pause
ECHO.
set flagfile=C:\testjava.txt
::Flagfile variable should already be defined before calling this function
Goto :CheckForDF
:DFNotFrozen
ECHO DeepFreeze wasn't installed or is currently thawed
ECHO **Continue with the rest of the script**
ECHO.
PAUSE
GOTO:eof
::***************************
::********Subroutines********
::***************************
:CheckForDF
WHERE dfc >nul 2>&1
::ErrorLEvel 0 means file was found, which means DF is installed
IF %ERRORLEVEL% EQU 0 (
dfc get /ISFROZEN
ECHO %errorlevel%
::ErrorLevel 0 - THAWED and ready to install
::ErrorLevel 1 - FROZEN and pointless to try
IF %errorlevel% EQU 1 (
::Echo out what WOULD have been installed to a file so we could check that the
:: script still ran (and get an idea of how bad we need to unfreeze and log into each computer)
ECHO %flagfile% %date%%time% >> C:\BRCCIT\ScriptsSkippedByDeepFreeze.txt
ECHO ****DeepFreeze is currently frozen****
ECHO.
PAUSE
::Else - DeepFreeze is thawed. return to normal script
goto :EOF
)
::DeepFreeze is thawed, but is installed. We'll just fall through to the not installed result
)
::DeepFreeze Installation not found. Okay to return to normal script
ECHO DeepFreeze is not installed
goto :DFNotFrozen
ATUALIZAÇÃO: Eu desisti dos IFs aninhados e voltei para GOTOs e Labels. Não é tão bonito, mas este código realmente funciona e literalmente como dez minutos. Eu recuei para criar o efeito visual do "aninhamento" artificial
@ECHO Off
::CheckForDF here
ECHO We will now test for DeepFreeze ether not installed or is thawed
Pause
ECHO.
set flagfile=C:\testjava.txt
::Flagfile variable should already be defined before calling this function
Goto :CheckForDF
:DFNotFrozen
ECHO DeepFreeze wasn't installed or is currently thawed
ECHO **Continue with the rest of the script**
ECHO.
PAUSE
GOTO:eof
::***************************
::********Subroutines********
::***************************
:CheckForDF
WHERE dfc >nul 2>&1
IF %ErrorLevel% EQU 0 Goto :DFInstalled
::ELSE - DF Not found
GOTO :ReturnToScript
:DFInstalled
::DFC.exe get /ISFROZEN
Call ExitWithSpecifiedCode.bat 1
::If Frozen
IF %ErrorLevel% EQU 1 GOTO DFFrozen
::If Thawed
IF %ErrorLevel% EQU 0 GOTO ReturnToScript
:DFFrozen
ECHO %flagfile% %date%%time% >> C:\BRCCIT\ScriptsSkippedByDeepFreeze.txt
ECHO ****DeepFreeze is currently frozen****
ECHO.
PAUSE
::Exit Script Execution
goto :EOF
:ReturnToScript
ECHO ReturnToScript
PAUSE
GOTO (Return to script execution)
ERRORLEVEL não atualiza os blocos de controle internos, como as instruções IF, a menos que você use! ERRORLEVEL! em vez de% ERRORLEVEL% e use este comando no início do seu código: setlocal ENABLEDELAYEDEXPANSION
consulte o link
Seu problema é que sua segunda verificação ESTÁ DENTRO do bloco de código que é usado SOMENTE se sua primeira verificação for igual a 0. Você é como:
IF (we want to go out) THEN (
IF (it rains) THEN (
take umbrella
)
)
Veja, a segunda checagem para ver se chove é executada se, e APENAS se, nós queremos sair. Se não queremos sair, não nos preocupamos em checar a chuva.
Solução: feche o bloco após o seu primeiro IF antes de chegar ao segundo, para obter:
IF %ERRORLEVEL% EQU 0 (
do stuff
)
IF %errorlevel% EQU 1 (
do other stuff
)
Ou use um ELSE:
IF %ERRORLEVEL% EQU 0 (
do stuff
)
ELSE (
:: errorlevel was anything other than 0, i.e. NEQ 0
do other stuff
)
Eu não tenho uma máquina Windows facilmente disponível, mas se fosse eu, eu verificaria que a declaração ECHO
não muda ERRORLEVEL
.
Provavelmente isto não está relacionado, mas talvez você esteja usando um interpretador de comandos que trata maiúsculas e minúsculas ERRORLEVEL
diferentemente? Mesmo que isso não tenha efeito, é peculiar ser inconsistente.
O seguinte arquivo em lote lhe dará o status que você está procurando. Você pode facilmente ajustar o gotos
e os rótulos para atender às suas necessidades.
Se o arquivo existe está marcado, e ERRORLEVEL
é atualizado apropriadamente.
@echo off
REM ---------------------------------------------------------------------------------
REM -- Check the status of Deep Freeze
set "DFC=C:\Program Files (x86)\Faronics\Deep Freeze Enterprise\DFC.exe"
if not exist "%DFC%" goto alwaysRun
"%DFC%" get /ISFROZEN >nul 2>&1
if [9009] == [%ERRORLEVEL%] goto alwaysRun
if ERRORLEVEL 1 goto isFrozen
if ERRORLEVEL 0 goto isThawed
REM ---------------------------------------------------------------------------------
REM ---------------------------------------------------------------------------------
REM -- Run all the commands when the workstation is frozen
REM -- (these commands are skipped when the workstation is thawed)
goto alwaysRun
:isFrozen
echo The workstation is frozen
REM ---------------------------------------------------------------------------------
REM ---------------------------------------------------------------------------------
REM -- Run all the commands when the workstation is thawed
REM -- (these commands are skipped when the workstation is frozen)
goto alwaysRun
:isThawed
echo The workstation is thawed
REM ---------------------------------------------------------------------------------
REM ---------------------------------------------------------------------------------
:alwaysRun
echo Always run this part
REM ---------------------------------------------------------------------------------
REM ---------------------------------------------------------------------------------
:end
pause