How to run multiple .BAT files within a .BAT file
我正试图让我的
EDOCX1[0]含量:
1 2 3 | "msbuild.bat" "unit-tests.bat" "deploy.bat" |
这看起来很简单,但是
我已经分别运行了每个文件,没有任何问题。
用途:
1 2 3 | call msbuild.bat call unit-tests.bat call deploy.bat |
不使用call时,当前批处理文件停止,被调用的批处理文件开始执行。这是一种特殊的行为,可以追溯到早期的MS-DOS时代。
所有其他答案都是正确的:使用Call。例如:
1 | call"msbuild.bat" |
历史
在古老的DOS版本中,不可能递归地执行批处理文件。然后引入了call命令,调用另一个cmd shell来执行批处理文件,并在完成后将执行返回给调用的cmd shell。
显然,在以后的版本中,不再需要其他的命令shell。
在早期,许多批处理文件依赖于这样一个事实,即调用批处理文件不会返回到调用批处理文件。在没有附加语法的情况下改变这种行为会破坏许多系统,如批处理菜单系统(使用批处理文件作为菜单结构)。
在许多情况下,与Microsoft一样,向后兼容性也是导致这种行为的原因。
提示
如果批处理文件的名称中有空格,请在名称周围使用引号:
1 | call"unit tests.bat" |
顺便说一下:如果没有批处理文件的所有名称,也可以使用for来执行此操作(它不保证批处理文件调用的顺序正确;它遵循文件系统的顺序):
1 | FOR %x IN (*.bat) DO call"%x" |
您也可以在通话后对错误级别做出反应。用途:
1 | exit /B 1 # Or any other integer value in 0..255 |
返回错误级别。0表示正确执行。在调用批处理文件中,可以使用
1 | if errorlevel neq 0 <batch command> |
如果您的Windows比NT4/2000/XP旧,请使用
要控制批处理文件的流,可以执行以下操作:-(
1 2 3 4 5 6 7 | if errorlevel 2 goto label2 if errorlevel 1 goto label1 ... :label1 ... :label2 ... |
正如其他人指出的那样:看看构建系统来替换批处理文件。
如果要打开多个命令提示,则可以使用
1 | start cmd /k |
启动许多命令提示可以如下完成。
1 2 3 4 5 6 7 | 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. |
尝试:
1 2 3 | call msbuild.bat call unit-tests.bat call deploy.bat |
为了编译一个程序,您正在调用多个批。我想当然地认为,如果发生错误:1)批内的程序将以错误级别退出;2)你想知道。
1 | for %%b in ("msbuild.bat""unit-tests.bat""deploy.bat") do call %%b|| exit /b 1 |
""测试错误级别高于0。这样,所有批都按顺序调用,但在出现任何错误时都将停止,从而使屏幕保持原样,以便您看到任何错误消息。
1 2 3 | call msbuild.bat call unit-tests.bat call deploy.bat |
要在
1 | call foo.bat |
(是的,这很愚蠢,如果你能用
如果我们有两个批处理脚本,aaa.bat和bbb.bat,请如下调用
1 2 | call aaa.bat call bbb.bat |
执行脚本时,首先调用aaa.bat,等待aaa.bat线程终止,然后调用bbb.bat。
但如果不想等待aaa.bat终止调用bbb.bat,请尝试使用start命令:
1 2 3 4 | START ["title"] [/D path] [/I] [/MIN] [/MAX] [/SEPARATE | /SHARED] [/LOW | /NORMAL | /HIGH | /REALTIME | /ABOVENORMAL | /BELOWNORMAL] [/AFFINITY <hex affinity>] [/WAIT] [/B] [command/program] [parameters] |
考试:
1 2 | start /b aaa.bat start /b bbb.bat |
看看你的文件名,你是否考虑过使用一个构建工具,如NoT或Ant(Java版本)。与BAT文件相比,您将获得更多的控制权。
1 2 3 | Start msbuild.bat Start unit-tests.bat Start deploy.bat |
如果不起作用,用
1 2 3 4 5 6 7 | Start msbuild.bat Goto :1 :1 Start unit-tests.bat Goto :2 :2 Start deploy.bat |
如果要一次打开多个批处理文件,可以使用call命令。但是,call命令关闭当前BAT文件并转到另一个BAT文件。如果要一次打开多个,可以尝试以下操作:
1 2 | @echo off start cmd"call ex1.bat&ex2.bat&ex3.bat" |
等等,或者重复启动
在一个脚本中运行多个脚本时,我遇到了同样的问题。我一直让它在第一个脚本上死掉,却没有意识到它在第一个脚本上退出。
1 2 3 4 5 6 7 8 9 10 11 | :: OneScriptToRunThemAll.bat CALL ScriptA.bat CALL ScriptB.bat EXIT :: ScriptA.bat Do Foo EXIT ::ScriptB.bat Do bar EXIT |
我删除了所有11个脚本退出行,然后重试,所有11个脚本在同一个命令窗口中按顺序一次运行。
1 2 3 4 5 6 7 8 9 10 | :: OneScriptToRunThemAll.bat CALL ScriptA.bat CALL ScriptB.bat EXIT ::ScriptA.bat Do Foo ::ScriptB.bat Do bar |
只需使用
1 2 3 | call msbuild.bat call unit-tests.bat call deploy.bat |