遇到错误时如何使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的文章的启发

https://ss64.com/nt/syntax-substring.html

我们不能总是依赖于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 0ERRORLEVEL 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