題 如何檢查批處理文件中最後一個命令的退出代碼?


在Windows上的批處理文件中,我使用 7拉鍊 像這樣:

...\right_path\7z a output_file_name.zip file_to_be_compressed

我怎麼能檢查退出代碼 7z 並採取適當的行動?


64
2017-10-01 04:47


起源


還在Stackoverflow上詢問: 如何從Windows命令行獲取應用程序退出代碼? - Deanna


答案:


測試返回碼大於或等於1:

if ERRORLEVEL 1 echo Error

要么

if %ERRORLEVEL% GEQ 1 echo Error

或測試返回碼等於0:

if %ERRORLEVEL% EQU 0 echo OK

您可以使用其他命令,例如 GOTO 我在哪裡展示 echo


75
2017-10-01 04:58



我試過你的代碼。我收到以下錯誤: 0 was unexpected this time. - Misha Moroshko
@Misha:您可能已經按照我最初發布的百分號嘗試了它。沒有它們嘗試它或嘗試我添加的其他版本。 - Dennis Williamson
發現案例在哪裡 %ERRORLEVEL% 即使發生錯誤,也為0。檢查時發生了 %ERRORLEVEL% 在cmd文件中。試 start /wait 沒用。唯一有效的是 if errorlevel 1 (...) - AlikElzin-kilaka
請注意,errorlevel是 不是環境變量。這是一個很好的總結 陷阱和微妙之處。 - Nick Westgate
我建議使用 NEQ 代替 EQU 支持檢測否定返回碼?不知道Windows XP是否能做到這一點,但它在現代Windows上是一件事...... - binki


當你有:App1.exe調用 - > .bat運行 - > app2.exe時,這確實有效

App2返回錯誤級別1 ...但你需要在.bat中捕獲它並將其重新提升到app1 ...否則.bat吃錯誤級別,app1永遠不會知道。

方法:

在.bat:

app2.exe
if %ERRORLEVEL% GEQ 1 EXIT /B 1

這是app2之後的errorlevel檢查。如果> 0,則.bat退出並將調用app1的errorlevel設置為1。


9
2018-04-19 05:07



如果你將相同的錯誤返回給app1可能會更好。我沒試過,但它應該工作: if %ERRORLEVEL% GEQ 1 EXIT /B %ERRORLEVEL%。 - Viktor Fonic
至少在Windows中,%ERRORLEVEL%可以是負數(例如,我有一個程序在錯誤時返回-1)。 IF %ERRORLEVEL% NEQ 0 EXIT /B %ERRORLEVEL% 可能是一個更好的選擇。但是你真的需要知道程序在錯誤上返回什麼。某些程序返回某些非零代碼以獲得特殊類型的成功。 - Euro Micelli
如果app2是你在bat文件中運行的最後一件事,那麼錯誤代碼將會傳播。 - AnrDaemon