关于cmd:如何在.BAT文件中运行多个.BAT文件

How to run multiple .BAT files within a .BAT file

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

EDOCX1[0]含量:

1
2
3
"msbuild.bat"
"unit-tests.bat"
"deploy.bat"

这看起来很简单,但是commit-build.bat只执行列表中的第一项(msbuild.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旧,请使用if errorlevel 1捕获所有错误级别1及更高级别的错误。

要控制批处理文件的流,可以执行以下操作:-(

1
2
3
4
5
6
7
if errorlevel 2 goto label2
if errorlevel 1 goto label1
...
:label1
...
:label2
...

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


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

1
start cmd /k

/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


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

1
call foo.bat

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


如果我们有两个批处理脚本,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

如果不起作用,用call替换start,或者尝试:

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"

等等,或者重复启动cmd"call",以查看文件的数量。这适用于Windows 7,但我不确定其他系统。


在一个脚本中运行多个脚本时,我遇到了同样的问题。我一直让它在第一个脚本上死掉,却没有意识到它在第一个脚本上退出。

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


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

1
2
3
call msbuild.bat
call unit-tests.bat
call deploy.bat