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

问题描述 投票:1回答:1

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

windows batch-file command-prompt
1个回答
1
投票

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

1) Simple solution that may or may not work, depending on the commands

当且仅当出现错误时,某些内部命令才设置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) Slightly more complex solution that always works

与您当前的解决方案一样,您在开始时将自己的错误变量设置为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%
© www.soinside.com 2019 - 2024. All rights reserved.