ทำไมค่าของ ErrorLevel จึงไม่อัพเดท?


1

ฉันกำลังพยายามเขียนรูทีนย่อยเป็นชุดเพื่อตรวจสอบว่าคอมพิวเตอร์ติดตั้ง Deep freeze หรือไม่ปลอดภัย (สำหรับผู้ที่ไม่ทราบDeep Freezeเป็นโปรแกรมที่ใช้ในการแปลง / ป้องกันและเปลี่ยนแปลงดิสก์ในระบบปฏิบัติการ) dfc.exeเป็นไฟล์ที่ติดตั้งการตรึงแบบลึกที่สามารถใช้เพื่อพิจารณา มันจะคืนค่า 0 ถ้าละลายหรือ 1 ถ้าเป็นน้ำแข็ง

โดยพื้นฐานแล้วฉันคิดว่ามันไม่มีประโยชน์ที่จะเรียกใช้สคริปต์ที่ติดตั้งสิ่งต่าง ๆ หากคอมพิวเตอร์หยุดทำงาน ก่อนอื่นฉันตรวจสอบว่ามีการติดตั้ง dfc.exe หรือไม่จากนั้นฉันพยายามตรวจสอบสถานะการละลาย / แช่แข็ง แต่ปัญหาคือว่าด้วยเหตุผลบางอย่างค่าส่งคืนของ dfc ดูเหมือนจะไม่อัปเดตสำหรับที่ฉันตรวจสอบ errorlevel เป็นครั้งที่สอง

ทุกคนรู้ว่าทำไมฉันไม่เห็นค่าส่งคืนของการตรวจสอบ ErrorLevel ที่สอง ( บรรทัดที่ 41 ) ฉันได้รวมรหัสด้านล่างด้วย

แก้ไข: เพิ่ม Psuedocode สำหรับกระบวนการคิดของฉันก่อนรหัส

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

อัปเดต: ฉันเลิกใช้ IFs ที่ซ้อนกันและกลับไปที่ GOTO และป้ายกำกับ มันไม่ได้สวย แต่รหัสนี้ใช้ได้จริงและในเวลาสิบนาที ฉันเยื้องมันเพื่อสร้างผลภาพของ "รัง" ประดิษฐ์

@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และขัดข้องสคริปต์ โดยเฉพาะฉันแทนที่ IF ที่ตรวจสอบว่ามีการค้นพบไฟล์ระหว่าง Point1 และ Point2 (ฉันแทนที่อันอื่นเช่นกัน แต่สคริปต์ขัดข้องก่อนถึงที่นั่น)
— PsychoData

1
ฉันคิดว่ารูปแบบการif errorlevel nส่งผ่านเมื่อ errorlevel มากกว่าหรือเท่ากับ n ดังนั้นจึงif errorlevel 0ไม่มีเหตุผล แต่สำหรับส่วนที่การตรวจสอบif errorlevel 1ควรทำงาน
— Pablo Montilla

@PabloMontilla อ่าแตกต่างกันนิดหน่อยที่ฉันพลาด แป๊บนึง.
— PsychoData

ฉันคิดว่ามันไม่ชอบ errorlevel 0 ฉันกลับไปที่วิธีที่ฉันตรวจสอบแล้ว ดูเหมือน checkinmg ข้อผิดพลาดระดับที่ (ของคุณ) วิธีทำสิ่งแปลก ๆ ในบรรทัด snag.gy/dpXHr.jpg
— PsychoData

คำตอบ:


2

ข้อผิดพลาดไม่อัปเดตภายในบล็อกควบคุมเช่นคำสั่ง IF เว้นแต่ว่าคุณจะใช้! ERRORLEVEL! แทน% ERRORLEVEL% และใช้คำสั่งนี้เมื่อเริ่มต้นโค้ดของคุณ: setlocal ENABLEDELAYEDEXPANSION

ดูhttp://batcheero.blogspot.ca/2007/06/how-to-enabledelayedexpansion.html


0

ปัญหาของคุณคือการตรวจสอบครั้งที่สองของคุณภายในบล็อกของรหัสที่ใช้เฉพาะในกรณีที่การตรวจสอบครั้งแรกของคุณเท่ากับ 0 คุณชอบ:

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

ดูการตรวจสอบครั้งที่สองเพื่อดูว่าฝนจะดำเนินการถ้าและเฉพาะในกรณีที่เราต้องการที่จะออกไป หากเราไม่ต้องการออกไปข้างนอกเราก็ไม่ต้องไปตรวจสอบฝน

วิธีแก้ปัญหา: ปิดบล็อกหลังจาก 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
)

ดังนั้นคำตอบของคุณดีมาก แต่ฉันคิดว่าคุณเข้าใจผิดเล็กน้อย ฉันได้เพิ่ม psuedocode เพื่ออธิบายกระบวนการคิดโดยทั่วไปโดยไม่เกิน โดยทั่วไปที่ Point2 ฉันต้องการเรียกใช้คำสั่ง DFC แล้วที่ Point3 ฉันต้องใช้คำสั่งสองคำสั่ง หากไม่มีการแช่แข็งก็จะข้ามไปที่ IF และทำให้เป็น P4 ไม่มีการดำเนินการใด ๆ ที่นี่และจะทำให้ IF ภายในเสร็จสมบูรณ์และทำให้เป็น P5 ที่ P5 เรากลับไปหลังจากที่เราออกจากที่แรก
— PsychoData

... ฉันทำรัง IF ผิดหรืออะไรนะ?
— PsychoData

อืมดูเหมือนว่าฉันเข้าใจผิดอย่างแน่นอน ดังนั้น ... ปัญหาของคุณคือบรรทัด "ECHO% errorlevel%" ส่งคืนค่า 0 เสมอหรือส่งคืน 1 เสมอแม้ว่าจะไม่ได้หรือไม่ มันจะส่งคืนอะไรเสมอ?
— SadBunny

errorlevel ของฉันจะต้องเป็นศูนย์เสมอเมื่อฉันป้อน IF แรกและถึง Point2 หลังจากนั้น dfc.exe จะดำเนินการและหากคอมพิวเตอร์ถูกแช่แข็ง Errorlevel จะเปลี่ยนเป็น 1 (ตามที่ฉันเข้าใจสิ่งต่าง ๆ ) แต่ไม่ว่าฉันจะทำอะไร ไม่เคยเห็นว่า ฉันได้ลองเปลี่ยนสายที่เรียกว่า dfc get / ISFROZEN เพื่อเรียกไฟล์ bat ชั่วคราวที่จะเปลี่ยน errorlevel เป็นอย่าง 1231234 เพื่อดูว่าฉันจะได้เห็นมันหรือไม่ ยังไม่ได้
— PsychoData

0

ฉันไม่ได้มีเครื่อง windows ที่มีอยู่ได้อย่างง่ายดาย แต่ถ้าเป็นผมผมจะตรวจสอบว่าคำสั่งที่ไม่เปลี่ยนแปลงECHOERRORLEVEL

อาจเป็นไปได้ว่านี่ไม่เกี่ยวข้องกัน แต่บางทีคุณกำลังใช้ล่ามคำสั่งที่ใช้ตัวพิมพ์ใหญ่และตัวพิมพ์เล็กERRORLEVELต่างกันหรือไม่? แม้ว่ามันจะไม่มีผลกระทบ แต่ก็เป็นเรื่องแปลกที่จะไม่สอดคล้องกัน


ข้อผิดพลาดระดับบน / ตัวพิมพ์เล็กทำให้ไม่แตกต่างกัน มันสะอาดกว่าสำหรับฉันที่จะแก้ไขแม้ว่าฉันจะไม่รบกวนการแก้ไขในคำถาม แต่เพียงสำเนาของฉัน ฉันมักจะได้รับทุกอย่างทำงานแล้วทำให้มันสวย
— PsychoData

ฉันคิดว่ามันคงเหมือนเดิมทุกประการ หากคุณกำลังพูดถึงบรรทัดที่ฉันเพิ่งแสดงข้อผิดพลาดระดับฉันมีปัญหาเดียวกันก่อนและฉันก็ใส่ไว้ในนั้นเพื่อแก้ไขปัญหา 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.