ทำไมค่าของ 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.