Windows批处理 - 返回失败EXITCODE但不要在失败的指令上放弃脚本

时间:2017-12-14 19:01:43

标签: windows batch-file command-prompt

我想问你是否可以提示我一个更优雅的解决方案(比本帖末尾提供的解决方案)解决这个问题:我想运行一个批处理脚本,如果(至少)其中一条指令失败,将继续运行其他指令,但会返回错误级别,指示失败(例如,1)。

我测试(并且有效)的一个解决方案如下:

set instructionfailed=0
**INSTRUCTION THAT WILL FAIL (ex. copy a a)**
if %errorlevel% == 1 set instructionfailed=1
**INSTRUCTION THAT WILL SUCCEED (ex.(supposing abcdefg does not exist) mkdir abcdefg) **
if %errorlevel% == 1 set instructionfailed=1
exit /b %instructionfailed%
编辑:我实际上已经读过(here, for example),也许我应该使用ERRORLEVEL而不是%errorcode%,但是我必须将其与此集成的代码似乎也使用%errorcode%。

1 个答案:

答案 0 :(得分:1)

有一种非常简单的技术可以使用,具体取决于执行哪些命令,另一种稍微复杂的技术将始终有效。

1)根据命令

,可能有效也可能无效的简单解决方案

当且仅当出现错误时,某些内部命令才设置ERRORLEVEL,并且有些内部命令在成功或错误时始终设置ERRORLEVEL。外部命令始终设置ERRORLEVEL。

因此,如果所有命令都是 的内部命令,则在成功时清除ERRORLEVEL,那么您可以在开始时清除ERRORLEVEL,然后运行每个命令连续命令。如果任何一个命令失败,ERRORLEVEL将仅为非零(表示错误)。您最后可以发出EXIT /B,并返回当前的ERRORLEVEL。

在开始时将ERRORLEVEL清除为0的一种神秘但快速的方法是使用(call ) - 尾随空间至关重要。

(call )
internalCommand1
internalCommand2
...
internalCommandN
exit /b

可以在Which cmd.exe internal commands clear the ERRORLEVEL to 0 upon success?找到可以使用此解决方案的内部命令列表。同样,要使此解决方案正常工作,您需要 的内部命令在成功时清除ERRORLEVEL。

2)总是有效的稍微复杂的解决方案

与您当前的解决方案一样,您在开始时将自己的错误变量设置为0,并在每个命令之后在出错时有条件地将其设置为非零。但是,您可以使用条件if errorlevel 1命令连接运算符,而不是使用if %errorlevel% neq 0||,该运算符仅在前一个命令失败时执行命令。

set "err=0"
anyCommand1 || set "err=1"
anyCommand2 || set "err=1"
...
anyCommandN || set "err=1"
exit /b %err%