我想问你是否可以提示我一个更优雅的解决方案(比本帖末尾提供的解决方案)解决这个问题:我想运行一个批处理脚本,如果(至少)其中一条指令失败,将继续运行其他指令,但会返回错误级别,指示失败(例如,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%。
答案 0 :(得分: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。
与您当前的解决方案一样,您在开始时将自己的错误变量设置为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%