ตั้งค่า ERRORLEVEL เป็น 0


14

ฉันมีไฟล์แบตช์ที่เป็น wrapper รอบ ๆ ตัวติดตั้ง ไฟล์แบตช์นี้ตรวจสอบระดับข้อผิดพลาดที่ส่งคืนโดยผู้ติดตั้งและพิมพ์ตามนั้น

ฉันสังเกตเห็นว่าถ้าฉันดำเนินการset ERRORLEVEL=0ในพรอมต์คำสั่งก่อนที่จะเริ่มการทำงานแบตช์ไฟล์ (ในหน้าต่างคำสั่ง / สภาพแวดล้อมเดียวกัน) ตัวติดตั้งจะไม่ยุ่งกับ errorlevel และแบทช์สคริปต์ของฉันจะส่งคืนผ่านเสมอ ฉันสันนิษฐานว่า%ERRORLEVEL%เป็นตัวแปรที่กำหนดโดย Windows และใช้เฉพาะในการพิมพ์ข้อผิดพลาดจากโปรแกรมและสคริปต์และการใช้ตัวแปรในไฟล์แบทช์หรืออย่างอื่นจะเป็น 'ความเสี่ยงของคุณเอง' เพราะมันสามารถเปลี่ยนแปลงได้ตลอดเวลาโดย กระบวนการอื่น

จากสิ่งที่ดูเหมือนว่าเมื่อฉันตั้ง errorlevel ในสภาพแวดล้อมที่กำหนดมันก็เลยยุติการใช้ errorlevel เป็นผู้ถือของรหัสทางออก ไม่มีใครรู้ว่าทำไมถึงเป็นเช่นนี้? สำหรับฉันมันเป็นพฤติกรรมที่ไม่คาดคิดที่แปลกประหลาด ข้อมูลใด ๆ ในหัวข้อจะได้รับการชื่นชมอย่างมาก!


คำตอบ:


14

คุณกำลังกำหนดตัวแปรระบบใหม่เป็นตัวแปรปกติ เมื่อคุณทำเช่นนี้ระบบจะไม่ใช้มันจนกว่าเซสชันคำสั่งจะปิด

วิธีที่ดีที่สุดคือการใช้

exit /b 0

ในไฟล์แบตช์อื่นและเรียกใช้จากสคริปต์หลักของคุณ ซึ่งมีจำนวน 0 errorlevelเป็นที่ต้องการของคุณ อาจเป็นได้ว่าหรือใช้คำสั่งที่รีเซ็ตerrorlevelสำหรับคุณเช่น echo, findstr เป็นต้น

ตัวอย่างเช่นคำสั่งต่อไปนี้ทั้งหมดจะถูกตั้งค่าERRORLEVELเป็น 0 ภายในแบทช์ไฟล์ของคุณ:

VERIFY > nul

cmd /c "exit /b 0"

ver > nul     

2
เกือบถูกต้องแล้ว คุณสามารถได้รับ "ระบบ" เพื่อใช้ ERRORLEVEL แบบไดนามิกเพียงแค่ยกเลิกการกำหนดค่าที่ผู้ใช้กำหนดโดยใช้set "errorlevel="
dbenham

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

1
"ไม่ว่าจะหรือใช้คำสั่งที่รีเซ็ตข้อผิดพลาดระดับสำหรับคุณเช่น echo, findstr เป็นต้น" คำสั่ง echo ไม่รีเซ็ตตัวแปร errorlevel
antred

ขณะที่คนอื่น ๆ ได้กล่าวว่าถ้าerrorlevel ตัวแปรได้รับการ "ด้วยตนเอง" ชุดโดยผู้ใช้ / ชุดกับ"set errorlevel=0"ที่errorlevelตัวแปรจะไม่ได้สะท้อนให้เห็นถึงรหัสทางออก if errorlevel do somethingแต่คุณยังคงสามารถเข้าถึงรหัสทางออกด้วย
Kevin Fegan

(1) คำถามทั่วไปเพิ่มเติมคือ“ ฉันจะตั้งค่า ERRORLEVEL เป็นค่าที่กำหนดเองเช่น 42 ได้อย่างไร”  cmd /c exit 42 น่าจะเป็นคำตอบที่ดีที่สุด (2) ดังที่  dbenham ชี้ให้เห็นคุณไม่จำเป็นต้อง  /bใช้คำพูดหรือคำพูด
สกอตต์

12

คุณไม่ควรกำหนดค่าของคุณเองให้กับตัวแปรระบบแบบไดนามิกเช่น ERRORLEVEL, PATH, CD, DATE, TIME, ฯลฯ การทำเช่นนี้จะป้องกันโค้ดจากการดูค่าแบบไดนามิก คุณสามารถกู้คืนค่าไดนามิกได้โดยเพียงยกเลิกการกำหนดค่าที่ผู้ใช้กำหนด ตัวอย่างเช่น:

set "errorlevel="

หากคุณต้องการที่จะบังคับให้ errorlevel เป็น 0 แล้วคุณสามารถใช้ทั้งหมดไม่ใช่งานง่าย (call )แต่มีประสิทธิภาพมากรูปแบบนี้: พื้นที่หลังการโทรมีความสำคัญ หากคุณต้องการตั้ง errorlevel เป็น 1 (call)คุณสามารถใช้ เป็นสิ่งสำคัญที่ไม่มีช่องว่างหลังการโทร

(call)
echo %errorlevel%
(call )
echo %errorlevel%

วิธีที่ง่ายกว่า แต่สะดวกกว่าในการตั้ง errorlevel คือการใช้รูทีนย่อยเฉพาะในไฟล์แบตช์:

call :setErr 1
echo %errorlevel%
call :setErr 0
echo %errorlevel%
exit /b

:setErr
exit /b %1

หรือถ้าในบรรทัดคำสั่งคุณสามารถใช้

cmd /c exit 1
echo %errorlevel%
cmd /c exit 0
echo %errorlevel%

8

ฉันใช้สิ่งนี้เป็นการส่วนตัว:

cd .

ทำงานได้แม้ในยูนิกซ์เชลล์


แต่อันนี้อาจเร็วกว่านี้เล็กน้อย: type nul>nulเนื่องจาก Process Monitor แสดงการQueryDirectoryเรียกบนcd .PS: cd .มีผลข้างเคียงที่ดีอีกอย่างในยูนิกซ์เชลล์ จะกู้คืนไดเร็กทอรีการทำงานที่สร้างขึ้นใหม่ในเทอร์มินัลหากถูกเปิดก่อนที่จะลบ
Andry

2

ต่อไปนี้เป็นวิธีอื่นในการรีเซ็ตErrorLevelสถานะซึ่งแม้แต่ทำงานใน MS-DOS (อย่างน้อยสำหรับรุ่น 6.22):

more < nul > nul

rem // The `> nul` part can be omitted in Windows but is needed in MS-DOS to avoid a line-break to be returned:
sort < nul > nul

วิธีการต่อไปนี้ทำงานใน MS-DOS เท่านั้น:

command /? > nul

fc nul nul > nul

เพื่อความสมบูรณ์นี่เป็นการตั้งค่าErrorLevelสถานะเป็น1ใช้ได้ทั้ง Windows และ MS-DOS:

< nul find ""

1

นี่คือสิ่งเดียวที่ฉันได้พบว่าใช้งานได้

call (exit /b 0)

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


0

สิ่งเหล่านี้จะใช้งานได้: (ตั้งข้อผิดพลาดระดับเป็น 1)

วิธีที่ 1

color 00

วิธีที่ 2

echo A | find "B"

คุณยังสามารถใช้สิ่งนี้เพื่อตั้งข้อผิดพลาดระดับ 1-26:

echo Your errorlevel<sup>th</sup> character between A-Z | choice /c:Enter A-Z here /n
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.