首页 文章

如何在.BAT文件中运行多个.BAT文件

提问于
浏览
578

我正在尝试让我的 commit-build.bat 执行其他.BAT文件作为构建过程的一部分 .

内容 commit-build.bat

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

这看起来很简单,但 commit-build.bat 只执行列表中的第一项( msbuild.bat ) .

我已经分别运行了每个文件而没有任何问题 .

13 回答

  • 1000

    如果我们有两个批处理脚本,aaa.bat和bbb.bat,并调用如下

    call aaa.bat
    call bbb.bat
    

    执行脚本时,它将首先调用aaa.bat,等待aaa.bat的线程终止,然后调用bbb.bat .

    但是如果您不想等待aaa.bat终止调用bbb.bat,请尝试使用START命令:

    START ["title"] [/D path] [/I] [/MIN] [/MAX] [/SEPARATE | /SHARED]
      [/LOW | /NORMAL | /HIGH | /REALTIME | /ABOVENORMAL | /BELOWNORMAL]
      [/AFFINITY <hex affinity>] [/WAIT] [/B] [command/program]
      [parameters]
    

    考试:

    start /b aaa.bat
    start /b bbb.bat
    
  • 24

    尝试:

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

    只需使用 call 命令!这是一个例子:

    call msbuild.bat
    call unit-tests.bat
    call deploy.bat
    
  • 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.
    
  • 159

    所有其他答案都是正确的:使用电话 . 例如:

    call "msbuild.bat"
    

    History

    在古代DOS版本中,无法以递归方式执行批处理文件 . 然后引入了调用命令,该命令调用另一个cmd shell来执行批处理文件,并在完成时将执行返回给调用的cmd shell .

    显然在以后的版本中,不再需要其他cmd shell了 .

    在早期,许多批处理文件取决于调用批处理文件不会返回到调用批处理文件的事实 . 在没有附加语法的情况下更改该行为会破坏许多系统,如批处理菜单系统(使用菜单结构的批处理文件) .

    与Microsoft的许多情况一样,因此向后兼容性是导致此行为的原因 .

    Tips

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

    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>
    

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

    要控制批处理文件的流量,有goto :-(

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

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

  • 92

    您正在调用多个批处理以编译程序 . 我理所当然地认为如果发生错误:
    1)批处理中的程序将以错误级别退出;
    2)你想知道它 .

    for %%b in ("msbuild.bat" "unit-tests.bat" "deploy.bat") do call %%b|| exit /b 1
    

    '||'测试错误级别高于0.这样所有批次都按顺序调用,但会在任何错误时停止,让屏幕保持原样,以便您查看任何错误消息 .

  • 36
    call msbuild.bat
    call unit-tests.bat
    call deploy.bat
    
  • 13

    要在 .bat 文件中调用 .bat 文件,请使用

    call foo.bat
    

    (是的,这很愚蠢,如果你能用 foo.bat 调用它会更有意义,就像你可以从命令提示符那样,但正确的方法是使用 call . )

  • 7

    如果要一次打开多个批处理文件,可以使用call命令 . 但是,call命令会关闭当前的bat文件并转到另一个文件 . 如果你想一次打开很多,你可能想试试这个:

    @echo off
    start cmd "call ex1.bat&ex2.bat&ex3.bat"
    

    依此类推或重复启动 cmdcall ...”,无论多少文件 . 这适用于 Windows 7 ,但我不确定其他系统 .

  • 3

    查看文件名,您是否考虑过使用NAnt或Ant(Java版本)等构建工具 . 你将获得比bat文件更多的控制权 .

  • 1

    在一个中运行多个脚本我遇到了同样的问题 . 我一直在第一个没有意识到它正在第一个脚本上退出而死 .

    :: OneScriptToRunThemAll.bat
    CALL ScriptA.bat
    CALL ScriptB.bat
    EXIT
    
    :: ScriptA.bat
    Do Foo
    EXIT
    ::ScriptB.bat
    Do bar
    EXIT
    

    我删除了所有11个脚本EXIT行并再次尝试,所有11个按顺序在同一个命令窗口中按顺序运行 .

    :: OneScriptToRunThemAll.bat
    CALL ScriptA.bat
    CALL ScriptB.bat
    EXIT
    
    ::ScriptA.bat
    Do Foo
    
    ::ScriptB.bat
    Do bar
    
  • 19

    使用:

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

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

  • 18
    Start msbuild.bat
    Start unit-tests.bat
    Start deploy.bat
    

    如果这不起作用,请将 start 替换为 call 或尝试此操作:

    Start msbuild.bat
    Goto :1
    :1
    Start unit-tests.bat
    Goto :2
    :2
    Start deploy.bat
    

相关问题