代码之家  ›  专栏  ›  技术社区  ›  Aviv Cohn

批处理中的最后一个命令似乎不起作用[重复]

  •  0
  • Aviv Cohn  · 技术社区  · 5 年前

    我想把我的 commit-build.bat 执行其他.BAT文件作为构建过程的一部分。

    内容 提交构建.bat

    "msbuild.bat"
    "unit-tests.bat"
    "deploy.bat"
    

    这看起来很简单,但是 提交构建.bat msbuild.bat ).

    我已经分别运行了每个文件,没有问题。

    0 回复  |  直到 6 年前
        1
  •  2
  •   robertcollier4    5 年前

    使用:

    call msbuild.bat
    call unit-tests.bat
    call deploy.bat
    

    不使用CALL时,当前批处理文件停止,被调用的批处理文件开始执行。这是一种可以追溯到早期MS-DOS时代的特殊行为。

        2
  •  0
  •   scientist_7    5 年前

     call "msbuild.bat"
    

    历史

    在古代的DOS版本中,不可能递归地执行批处理文件。然后引入call命令,该命令调用另一个cmd shell来执行批处理文件,并在完成后将执行返回给调用cmd shell。

    在早期,许多批处理文件依赖于调用批处理文件不会返回到调用批处理文件的事实。在没有附加语法的情况下改变这种行为可能会破坏许多系统,如批处理菜单系统(使用批处理文件作为菜单结构)。

    因此,与微软的许多情况一样,向后兼容是这种行为的原因。

    提示

    如果批处理文件的名称中有空格,请在名称周围使用引号:

    call "unit tests.bat"
    

    FOR %x IN (*.bat) DO call "%x"
    

    您也可以在呼叫后对错误级别做出反应。使用:

    exit /B 1   # Or any other integer value in 0..255
    

    把错误等级还给我。0表示正确执行。在调用批处理文件中,可以使用

    if errorlevel neq 0 <batch command>
    

    if errorlevel 1 如果您有一个比NT4/2000/XP旧的Windows来捕获所有的错误级别1和更高的错误级别。

    if errorlevel 2 goto label2
    if errorlevel 1 goto label1
    ...
    :label1
    ...
    :label2
    ...
    

    正如其他人指出的那样:看看构建系统来替换批处理文件。

        3
  •  0
  •   Quinn    5 年前

    如果要打开多个命令提示,则可以使用

    start cmd /k
    

    /k :是强制执行的。

    启动许多命令提示可以如下所示。

    start cmd /k Call rc_hub.bat 4444
    
    start cmd /k Call rc_grid1.bat 5555
    
    start cmd /k Call rc_grid1.bat 6666
    
    start cmd /k Call rc_grid1.bat 5570.