使用"EXIT/BX"退出批次,其中X> = 1,就像使用&&或||时命令成功完成一样 批量调用之间的运算符

Jor*_*ens 18 windows cmd batch-file exit errorlevel

我正在尝试使用该EXIT /B X命令链接一系列.bat文件以返回成功或失败,&&以及||有条件地运行下一个.bat(例如a.bat && b.bat).

无论我是打电话EXIT /B 0还是其他任何结束a.bat,a.bat && b.bat都会在之后拨打b.bat.我的理解是EXIT /B 0应该设定ERRORLEVEL=0,这是成功,所以&&应该继续.与此相对应的是,调用EXIT /B 1应该设置ERRORLEVEL=1哪个失败,所以&&应该停止.我在这里错过了什么?

琐碎的例子:

对于非批处理命令,按预期执行:

C:\> echo test|findstr test>NUL && echo yes
yes

C:\> echo test|findstr test>NUL || echo yes

C:\> echo test|findstr nope>NUL && echo yes

C:\> echo test|findstr nope>NUL || echo yes
yes
Run Code Online (Sandbox Code Playgroud)

使用EXIT /B始终将a.bat视为成功:

C:\> echo @EXIT /B 0 > a.bat

C:\> a.bat && echo yes
yes

C:\> a.bat || echo yes

C:\> echo @EXIT /B 1 > a.bat

C:\> a.bat && echo yes
yes

C:\> a.bat || echo yes
Run Code Online (Sandbox Code Playgroud)

我从a.bat退出,这样怎么能a.bat && b.bata.bat || b.bat像预期的那样?

所有命令都在Windows XP SP3上的cmd.exe中运行.

And*_*ers 14

如果你问我,批处理文件中的退出代码会因为这个原因而中断,但是你可以使用一个hacky解决方法.作为批处理文件的最后一行,使用:

@%COMSPEC% /C exit 1 >nul
Run Code Online (Sandbox Code Playgroud)

由于这是一个开始的实际过程,因此您将获得一个真实的流程退出代码和&&和|| 将工作.

  • 我有点困惑,所以这只是其他人的一个注释,你真的需要它作为文件的最后一行.它实际上不会退出批处理,只需设置错误代码即可.在它之后直接调用`EXIT/B%ERRORLEVEL%`并不总是起作用.我找到的唯一可靠的方法是使用`IF ERRORLEVEL 1 goto:end`并在最后一行之前使用`%COMSPEC%/ C EXIT%ERRORLEVEL%> NUL标记`:end` (4认同)

mar*_*pet 12

它在使用call执行包含exit语句的批处理脚本时应该正常工作:

C:\>echo @EXIT /B 1 > a.bat

C:\>call a.bat && echo yes

C:\>call a.bat || echo yes
yes
Run Code Online (Sandbox Code Playgroud)

顺便说一句,它在Microsoft文档中错误地说:

在脚本或批处理文件之外使用时,调用在命令提示符下无效.