遇到错误时如何使batch file终止?
我有一个batch file,用不同的参数反复调用同一个可执行文件。 如果其中一个调用返回任何级别的错误代码,我该如何立即终止?
基本上,我想要相当于MSBuild的ContinueOnError=false
。
检查if
语句中的错误errorlevel
,然后exit /b
(仅退出b atch文件,而不是整个cmd.exe进程)中0以外的值。
same-executable-over-and-over.exe /with different "parameters" if %errorlevel% neq 0 exit /b %errorlevel%
如果你想让错误级别的值传播到你的batch file之外
if %errorlevel% neq 0 exit /b %errorlevel%
但如果这是在一个for
它有点棘手。 你需要更多的东西:
setlocal enabledelayedexpansion for %%f in (C:\Windows\*) do ( same-executable-over-and-over.exe /with different "parameters" if !errorlevel! neq 0 exit /b !errorlevel! )
编辑:你必须检查每个命令后的错误。 在cmd.exe / command.com批处理中没有全局的“错误goto”types的构造。 我也更新了CodeMonkey的代码,虽然我从来没有遇到任何批处理黑客在XP或Vista中的负面错误级别。
添加|| goto :label
|| goto :label
到每一行,然后定义一个:label
。
例如,创build这个.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%
另请参阅有关退出batch file子例程的问题 。
最短的:
command || exit /b
如果您需要,您可以设置退出代码:
command || exit /b 666
你也可以login:
command || echo ERROR && exit /b
一个小的更新,你应该改变检查“如果errorlevel 1”以下…
IF %ERRORLEVEL% NEQ 0
这是因为在XP上你可以得到负数作为错误。 0 =没有问题,其他都是问题。
并记住DOS处理“IF ERRORLEVEL”testing的方式。 如果您检查的号码是该号码或更高,则它将返回true,因此如果您正在查找特定的错误号码,则需要以255开头,然后closures。
这里是BASH和Windows CMD的多语言程序 ,它运行一系列的命令,如果任何一个命令失败,
#!/bin/bash 2> nul :; set -o errexit :; function goto() { return $?; } command 1 || goto :error command 2 || goto :error command 3 || goto :error :error :; exit 0 exit /b 0 :error exit /b %errorlevel%
过去我曾经使用过这种types的东西,用于多平台连续集成脚本。
无论我如何尝试,错误级别始终保持为0,即使msbuild失败。 所以我build立了我的解决方法:
生成项目并保存日志到Build.log
SET Build_Opt=/flp:summary;logfile=Build.log;append=true msbuild "myproj.csproj" /t:rebuild /p:Configuration=release /fl %Build_Opt%
在构build日志中search“0 Error”string,将结果设置为var
FOR /F "tokens=* USEBACKQ" %%F IN (`find /c /i "0 Error" Build.log`) DO ( SET var=%%F ) echo %var%
得到最后一个字符,它表示有多less行包含searchstring
set result=%var:~-1% echo "%result%"
如果找不到string,那么错误> 0,编译失败
if "%result%"=="0" ( echo "build failed" )
这个解决scheme受到了Mechaflash在如何将命令输出设置为batch file中variables的文章的启发
我们不能总是依赖于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
命令中有两个variables可以确定进程是否失败或成功,这些variables是ERRORLEVEL 0
和ERRORLEVEL 1
(1表示失败,0表示失败)。 下面是一个如何在batch file中使用的例子:
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
@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