[batch-file] 如何在遇到錯誤時使批處理文件終止?


Answers

添加|| goto :label || goto :label到每一行,然後定義一個:label

例如,創建這個.cmd文件:

@echo off

echo Starting very complicated batch file...
ping -invalid-arg || goto :error
echo OH noes, this shouldn't have succeeded.
goto :EOF

:error
echo Failed with error #%errorlevel%.
exit /b %errorlevel%

另請參閱關於退出批處理文件子例程的問題

Question

我有一個批處理文件,它使用不同的參數反複調用同一個可執行文件。 如果其中一個調用返回任何級別的錯誤代碼,我該如何立即終止?

基本上,我想要相當於MSBuild的ContinueOnError=false




我們不能總是依賴於ERRORLEVEL,因為很多時候外部程序或批處理腳本不會返回退出代碼。

在這種情況下,我們可以使用像這樣的失敗的通用檢查:

IF EXIST %outfile% (DEL /F %outfile%)
CALL some_script.bat -o %outfile%
IF NOT EXIST %outfile%  (ECHO ERROR & EXIT /b)

如果程序輸出一些東西來控制,我們也可以檢查它。

some_program.exe 2>&1 | FIND "error message here" && (ECHO ERROR & EXIT /b)
some_program.exe 2>&1 | FIND "Done processing." || (ECHO ERROR & EXIT /b)



只需使用ERRORLEVEL即可獲得您想要的結果。 ERRORLEVEL命令中有兩個變量可以確定進程是失敗還是成功,這些變量是ERRORLEVEL 0ERRORLEVEL 1 (1代表失敗,0代表通過)。 下面是一個關於如何在批處理文件中使用的例子:

echo off
cls
ping localhost 
errorlevel 0 goto :good
errorlevel 1 goto :bad

:good
cls
echo Good!
echo[
pause
exit

:bad
cls
echo Bad!
echo[
pause
exit

如果您需要更多信息,請點擊以下鏈接: Errorlevels




一個小的更新,你應該將“if errorlevel 1”的檢查更改為以下...

IF %ERRORLEVEL% NEQ 0 

這是因為在XP上你可以得到負數作為錯誤。 0 =沒有問題,其他都是問題。

並記住DOS處理“IF ERRORLEVEL”測試的方式。 如果您檢查的號碼是該號碼或更高,那麼它將返回true,因此如果您正在查找需要以255開始並減少的特定錯誤號碼。




Links



Tags

batch-file