18

我正在尝试使用命令链接一系列 .bat 文件EXIT /B X以返回成功或失败以及&&有条件||地运行下一个 .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

使用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

我怎样才能退出 a.bat 以便a.bat && b.bata.bat || b.bat预期运行?

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

4

4 回答 4

14

如果您问我,批处理文件中的退出代码正是由于这个原因而损坏的,但是您可以使用一个 hacky 解决方法。作为批处理文件的最后一行,使用:

@%COMSPEC% /C exit 1 >nul

由于这是一个已启动的实际进程,因此您将获得一个真正的进程退出代码和 && 和 || 将工作。

于 2011-01-08T22:16:27.190 回答
12

当使用call执行包含退出语句​​的批处理脚本时,它可以正常工作:

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

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

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

顺便说一句,它在Microsoft 文档上说错了:

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

于 2011-01-08T14:06:44.333 回答
0

如果你使用start /wait它,你也可以在一个由 DOS 批处理文件调用的非常简单的 Windows 应用程序(用 C# 编写)中使用它,如下所示:

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

然后您的 DOS 批处理文件可以调用该应用程序并评估结果。IE

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

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

您可以将所需的返回代码作为参数传递给您的 program.cs,并保证以这种方式将其取出。

于 2013-11-13T20:49:28.843 回答
0

我认为您正在接受Errorlevel=0,因为您确实在执行 a.bat (无论返回码如何)。

如果a.bat不存在,您将无法通过检查。CALL是我知道从a.bat.

于 2017-09-28T17:45:57.313 回答