我有一个批处理文件,它用不同的参数反复调用相同的可执行文件。如果其中一个调用返回任何级别的错误代码,我如何使它立即终止?
基本上,我想要等效于MSBuild的ContinueOnError=false。
我有一个批处理文件,它用不同的参数反复调用相同的可执行文件。如果其中一个调用返回任何级别的错误代码,我如何使它立即终止?
基本上,我想要等效于MSBuild的ContinueOnError=false。
当前回答
最短的:
command || exit /b
如果需要,可以设置退出码:
command || exit /b 666
你也可以登录:
command || echo ERROR && exit /b
其他回答
在每行添加|| 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%
请参见关于退出批处理文件子例程的问题。
一个小更新,你应该改变检查“if errorlevel 1”为以下…
IF %ERRORLEVEL% NEQ 0
这是因为在XP上你可以得到负数作为错误。0 =没问题,其他的都是问题。
记住DOS处理“IF ERRORLEVEL”测试的方式。如果您正在检查的数字是该数字或更高,它将返回true,所以如果您正在寻找特定的错误数字,您需要从255开始,然后往下算。
我们不能总是依赖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)
@echo off
set startbuild=%TIME%
C:\WINDOWS\Microsoft.NET\Framework\v3.5\msbuild.exe c:\link.xml /flp1:logfile=c:\link\errors.log;errorsonly /flp2:logfile=c:\link\warnings.log;warningsonly || goto :error
copy c:\app_offline.htm "\\lawpccnweb01\d$\websites\OperationsLinkWeb\app_offline.htm"
del \\lawpccnweb01\d$\websites\OperationsLinkWeb\bin\ /Q
echo Start Copy: %TIME%
set copystart=%TIME%
xcopy C:\link\_PublishedWebsites\OperationsLink \\lawpccnweb01\d$\websites\OperationsLinkWeb\ /s /y /d
del \\lawpccnweb01\d$\websites\OperationsLinkWeb\app_offline.htm
echo Started Build: %startbuild%
echo Started Copy: %copystart%
echo Finished Copy: %TIME%
c:\link\warnings.log
:error
c:\link\errors.log
我更喜欢OR形式的命令,因为我发现它们最有可读性(如 而不是在每个命令后面加一个if)。然而,幼稚的方式 命令|| exit /b %ERRORLEVEL%错误。
这是因为批处理在第一次读取一行时展开变量 而不是被使用的时候。这意味着如果在命令行中 上述失败,批处理文件正常退出,但退出时返回代码为0, 因为这是%ERRORLEVEL%在开始时的值 线。显然,这在我们的脚本中是不可取的,因此我们必须启用 延迟扩展,像这样:
SETLOCAL EnableDelayedExpansion
command-1 || exit /b !ERRORLEVEL!
command-2 || exit /b !ERRORLEVEL!
command-3 || exit /b !ERRORLEVEL!
command-4 || exit /b !ERRORLEVEL!
这个代码片段将执行命令1-4,如果其中任何一个失败,它将继续执行 使用与失败命令相同的退出代码退出。