我有一个批处理文件,它用不同的参数反复调用相同的可执行文件。如果其中一个调用返回任何级别的错误代码,我如何使它立即终止?

基本上,我想要等效于MSBuild的ContinueOnError=false。


当前回答

在每行添加|| 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%

请参见关于退出批处理文件子例程的问题。

其他回答

下面是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

:; exit 0
exit /b 0

:error
exit /b %errorlevel%

我曾经在一个多平台持续集成脚本中使用过这种类型的东西。

在每行添加|| 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,然后退出/b(仅退出批处理文件,而不是整个cmd.exe进程),如果值不是0。

same-executable-over-and-over.exe /with different "parameters"
if %errorlevel% neq 0 exit /b %errorlevel%

如果您希望errorlevel的值传播到批处理文件之外

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批处理中没有全局的“on error goto”类型的构造。我还根据CodeMonkey更新了我的代码,尽管我从未在XP或Vista上的任何批量黑客中遇到过负错误级别。

一个小更新,你应该改变检查“if errorlevel 1”为以下…

IF %ERRORLEVEL% NEQ 0 

这是因为在XP上你可以得到负数作为错误。0 =没问题,其他的都是问题。

记住DOS处理“IF ERRORLEVEL”测试的方式。如果您正在检查的数字是该数字或更高,它将返回true,所以如果您正在寻找特定的错误数字,您需要从255开始,然后往下算。

最短的:

command || exit /b

如果需要,可以设置退出码:

command || exit /b 666

你也可以登录:

command || echo ERROR && exit /b