我试图链接一系列.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.bat
和a.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拉入环境的唯一方法。