ErrorLevel의 값이 업데이트되지 않는 이유는 무엇입니까?


1

컴퓨터에 Deep Freeze가 설치되어 있는지 또는 안전하게 해제되었는지 확인하기 위해 일괄 적으로 서브 루틴을 작성하려고합니다. (모르는 사람들을 위해, 딥 프리즈 운영 체제에서 되돌리기 / 방지 및 디스크 변경에 일반적으로 사용되는 프로그램입니다.) dfc.exe 결정을 내리는 데 사용할 수있는 deep freeze 설치 파일입니다. 해동되면 0을 반환하고 고정 된 경우 1을 반환합니다.

기본적으로 컴퓨터가 정지 된 경우 특정 작업을 설치하는 스크립트를 실행하는 것이 의미가 없다고 생각했습니다. 먼저 dfc.exe가 설치되어 있는지 확인한 다음 해빙 / 고정 상태를 확인하려고 시도하지만 문제가있는 이유는 dfc의 반환 값이 errorlevel을 두 번째로 확인하는 위치를 업데이트하지 않는 것입니다.

누구도 왜 두 번째 ErrorLevel 검사의 반환 값을 볼 수 없는지 알 수 있습니다 ( on line 41 ) 아래 코드도 포함 시켰습니다.

편집 : 코드 앞에 내 사고 프로세스에 대한 의사 코드를 추가했습니다.

::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) 

아래 코드

@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

업데이트 : 중첩 된 IF를 포기하고 GOTO 및 Labels로 돌아갔습니다. 그것은 꽤 아니지만,이 코드는 실제로 작동하고 문자 그대로 10 분과 같습니다. 인공 네 스팅 (nesting)의 시각적 효과를 내기 위해 들여 썼습니다.

@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 1'을 확인하십시오.
Pablo Montilla

IF errorlevel 0 말한다 The Syntax of the Command is Incorrect 스크립트를 충돌시킵니다. 특히 파일을 Point1과 Point2 사이에서 찾았는지 확인하는 IF를 교체했습니다. (나는 다른 하나도 대체했으나 스크립트가 도착하기 전에 추락했습니다.)
PsychoData

1
나는 구문 if errorlevel n errorlevel이 n보다 크거나 같을 때 전달됩니다. 그래서 if errorlevel 0 의미가 없지만 검사를 수행하는 부분 if errorlevel 1 작동해야합니다.
Pablo Montilla

@ PabloMontilla 아, 내가 놓친 뉘앙스. 잠시만.
PsychoData

나는 그것이 errorlevel 0을 좋아하지 않는다고 생각한다, 나는 내가 그것을 점검했던 방식으로 되돌아 갔다. 그것은 errorlevel checkinmg처럼 보이는 (귀하의) 방식으로 이상한 것들이 줄에 않습니다. snag.gy/dpXHr.jpg
PsychoData

답변:



0

문제는 두 번째 검사가 첫 번째 검사가 0 인 경우에만 사용되는 코드 블록 내에 있다는 것입니다. 다음과 같습니다.

IF (we want to go out) THEN (
  IF (it rains) THEN (
    take umbrella
  )
)

보세요, 비가 내리는 지 아닌지 확인하는 두 번째 점검은 우리가 나가기를 원한다면 수행됩니다. 우리가 나가고 싶지 않다면, 우리는 비를 확인하지 않아도됩니다.

해결책 : 두 번째 if에 도달하기 전에 첫 번째 IF 후 블록을 닫으십시오.

IF %ERRORLEVEL% EQU 0 (
  do stuff
)
IF %errorlevel% EQU 1 (
  do other stuff
)

또는 ELSE를 사용하십시오.

IF %ERRORLEVEL% EQU 0 (
  do stuff
)
ELSE (
  :: errorlevel was anything other than 0, i.e. NEQ 0
  do other stuff
)

그래서 당신의 대답은 훌륭합니다.하지만 저는 당신이 조금 오해하고 있다고 생각합니다. 나는 모든 과잉없이 나의 일반적인 사고 과정을 설명하기 위해 의사 코드를 추가했다. 기본적으로 Point2에서 DFC 명령을 실행하고 Point3에서 몇 가지 명령을 실행해야합니다. 고정되어 있지 않으면 IF를 건너 뛰고 P4로 만듭니다. 아무것도 실행되지 않고 내부 IF를 완료하고 P5로 만듭니다. P5에서 우리는 처음부터 왼쪽으로 돌아 왔습니다.
PsychoData

... IFs를 잘못 중첩 시켰습니까?
PsychoData

Hmmz, 내가 실제로 오해 한 것 같습니다. 그래서 ... 문제는 "ECHO % errorlevel %"는 항상 0을 반환하거나 항상 없어야한다고하더라도 1을 항상 반환한다는 것입니다. 항상 돌아 오는 무엇입니까?
SadBunny

첫 번째 IF를 입력하고 Point2에 도달 한 후 dfc.exe가 실행되고 컴퓨터가 정지 된 경우 errorlevel이 1로 변경됩니다 (사물을 이해함에 따라). 그러나 아무리해도 나는 errorlevel을 0으로 설정해야합니다. 절대 보지 마. 나는 dfc를 호출하는 라인을 변경하려고 시도했다. / ISFROZEN은 errorlevel을 1231234와 같은 것으로 바꿀 수있는 임시 bat 파일을 호출하여 단지 볼 수 있는지를 확인했다. 여전히하지 않았다.
PsychoData

0

나는 쉽게 사용할 수있는 윈도우 머신을 가지고 있지 않지만, 그것이 나라면, 나는 ECHO 진술은 변하지 않는다. ERRORLEVEL.

아마도 이것은 관련이 없지만 어쩌면 대문자와 소문자를 처리하는 명령 인터프리터를 사용하고있을 것입니다 ERRORLEVEL 다르게? 그것이 아무 효과가 없더라도, 일관성이없는 것은 특이하다.


Upper / Lowercase errorlevel은 아무런 차이가 없습니다. 그것은 나를 위해 그것을 청소하는 것이 더 깨끗합니다, 나는 그 질문에 편집하는 것을 귀찮게하지 않을 것입니다, 단지 나의 사본. 나는 보통 일종의 일을하고 꽤 아름답게 만듭니다.
PsychoData

오류 수준을 변경하는 메아리에 관해서는, 이전과는 다른 것으로 생각합니다. 내가 errorlevel을 표시하는 라인에 대해 이야기하고 있다면, 나는 전에도 같은 문제를 겪고 있었고 문제 해결을 위해 거기에 넣었습니다. stackoverflow.com/questions/20770788/...
PsychoData

그것을 시도했다; echo는 errorlevel을 변경하지 않는 것 같습니다.
SadBunny

0

다음 배치 파일은 찾고있는 상태를 제공합니다. 쉽게 조정할 수 있습니다. gotos 및 귀하의 필요에 맞는 라벨.

파일이 존재하는지 여부를 확인하고 ERRORLEVEL 적절하게 업데이트됩니다.

@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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.