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

commit-build.bat的内容:

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

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

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


当前回答

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

其他回答

所有其他答案都是正确的:使用call。例如:

 call "msbuild.bat"

历史

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

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

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

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

Tips

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

call "unit tests.bat"

顺便说一句:如果您没有批处理文件的所有名称,也可以使用for来执行此操作(它不能保证批处理文件调用的顺序正确;它遵循文件系统的顺序):

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旧,请使用if errorlevel 1来捕获所有错误级别1及更高版本。

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

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

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

尝试:

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

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

如果要同时打开多个批处理文件,可以使用call命令。然而,call命令关闭当前bat文件并转到另一个文件。如果您想同时打开多个,可以尝试以下操作:

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

依此类推,或对任意多个文件重复start cmd“call…”。这适用于Windows7,但我不确定其他系统。

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

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

“||”测试错误级别是否高于0。这样,所有批次都会按顺序调用,但会在出现任何错误时停止,让屏幕保持原样,以便您看到任何错误消息。