如果使用&&或||,命令成功完成,X> = 1的`EXIT / BX`退出批处理 批量调用之间的运算符

我试图链接一系列.bat文件使用EXIT /BX命令返回成功或失败和&&和|| 有条件地运行下一个.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应该设置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 C:\> 

使用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 C:\> 

我如何退出a.bat,使a.bat && b.bata.bat || b.bat a.bat || b.bat行为如预期?

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

如果您问我,批处理文件中的退出代码因为这个确切的原因而被破坏,但是您可以使用一个蛮干的解决方法。 作为批处理文件的最后一行,使用:

 @%COMSPEC% /C exit 1 >nul 

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

它在使用调用来执行包含exit语句的批处理脚本时应如下工作:

 C:\>echo @EXIT /B 1 > a.bat C:\>call a.bat && echo yes C:\>call a.bat || echo yes yes C:\> 

顺便说一下,它在http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/call.mspx?mfr=true 错误地说:

在脚本或批处理文件之外使用时,调用在命令行上不起作用

如果你使用启动/等待,你也可以在一个非常简单的Win应用程序中使用这样的dos批处理文件,像这样

 static class Program { [STAThread] static void Main(string[] args) { Environment.ExitCode =Convert.ToInt32(args[0]); } } 

那么应用程序可以被你的dos批处理文件调用并评估结果。

 c:> start /wait SetRC 1 c:> if "%errorlevel%"=="1" goto abort 

注:批处理文件中不需要/ wait

你可以将你想要的返回代码作为参数传递给你的program.cs,并通过这种方式保证。

我认为你得到Errorlevel = 0,因为你确实执行a.bat(不管返回码)。 如果a.bat不存在,你将会失败。 CALL是我知道从a.bat拉入环境的唯一方法。