ปัญหาระดับข้อผิดพลาดของไฟล์แบตช์

ฉันใช้ Windows 7 Enterprise และเรียก jar จากแบตช์ไฟล์ซึ่งส่งคืน 0, 1 หรือ 2 ขึ้นอยู่กับเงื่อนไข ฉันใช้ "System.exit" เหมือนกัน

ต่อไปนี้เป็นสคริปต์ชุดงานของฉัน

@echo off

java -jar "test.jar" %*
set exitcode=%ERRORLEVEL%
echo here is 1st exit code %exitcode%
if %exitcode% == 2 (    
        VERIFY > nul
        set exitcode=%ERRORLEVEL%
        echo here is 2nd exit code after VERIFY %exitcode%
        call test.exe %*
        echo here is 2nd exit code %ERRORLEVEL% 

    if %ERRORLEVEL% == 0    (
           cmd /c "exit /b 0"
           call test1.exe -f
           echo here is 3rd exit code %errorlevel%
    )
)exit /b %errorlevel%

สิ่งที่ฉันกำลังทำในโค้ดด้านบนคือการเรียก jar และขึ้นอยู่กับระดับข้อผิดพลาดที่ส่งคืน ฉันกำลังเรียก exe อื่น และอีกครั้งขึ้นอยู่กับระดับข้อผิดพลาดของ exe นั้น ฉันกำลังเรียก exe ตัวที่สาม ปัญหาคือ exitcode ที่ฉันได้รับคือรหัสทางออกแรกที่กำหนด เช่น ถ้า test.jar มีอยู่กับ 2 แม้ว่าการดำเนินการ exe อื่น ๆ ระดับข้อผิดพลาดจะไม่ได้รับการเปลี่ยนแปลงสำเร็จก็ตาม และ exe ตัวที่สามไม่เคยถูกประหารชีวิต พยายามใช้วิธีการเรียกก

cmd ออก /b 0

สำหรับการรีเซ็ตระดับข้อผิดพลาดเป็น 0 แต่มันไม่ทำงาน


person Rahul Borkar    schedule 19.07.2012    source แหล่งที่มา


คำตอบ (2)


ปัญหาของคุณคือ cmd ขยายตัวแปรสภาพแวดล้อมทันทีเมื่อคำสั่ง แยกวิเคราะห์ ไม่ใช่เมื่อมีการดำเนินการ ข้อความในแง่นี้รวมถึง if ทั้งหมดรวมถึงบล็อกด้วย คุณต้องใช้การขยายแบบล่าช้า ดังนั้นให้ปฏิบัติตามสิ่งต่อไปนี้ที่จุดเริ่มต้นของแบทช์:

setlocal enabledelayedexpansion

จากนั้นใช้ !errorlevel! แทน %errorlevel% ภายในคำสั่งแบบมีเงื่อนไข (ในทำนองเดียวกันสำหรับ exitcode)

person Joey    schedule 19.07.2012

เมื่อถึงคำสั่ง IF แรกของคุณ %ERRORLEVEL% ที่เกิดขึ้นทั้งหมดจะถูกแทนที่ด้วยสิ่งที่มีอยู่ในปัจจุบัน (เหมือนกับรหัสทางออกที่ 1)

ใช้ !ระดับข้อผิดพลาด! และ/หรือ !EXITCODE! เพื่อให้เกิดความล่าช้าในการขยายเพื่อให้ตัวแปรเหล่านั้นถูกขยายในภายหลังโดยมีค่าที่ทันสมัยเหมือนเดิม

คุณต้องเพิ่ม setlocal enabledelayedexpansion ที่ด้านบนของสคริปต์

Eg

@echo off
setlocal enabledelayedexpansion
set FOO=foo
echo %FOO%
if 1==1 (
   set FOO=bar
   echo %FOO%
   echo !FOO!
)

ผลิต:

foo
foo
bar
person azhrei    schedule 19.07.2012