协慌网

登录 贡献 社区

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

我正在尝试获取我的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 时,当前的批处理文件将停止,被调用的批处理文件将开始执行。这是可以追溯到早期 MS-DOS 时代的一种特殊行为。

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

call "msbuild.bat"

历史

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

显然,在更高版本中,不再需要其他 cmd shell。

在早期,许多批处理文件都依赖于以下事实:调用批处理文件不会返回到调用批处理文件。在没有其他语法的情况下更改该行为将破坏许多系统,例如批处理菜单系统(将批处理文件用于菜单结构)。

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

尖端

如果批处理文件的名称中包含空格,请在名称两边加上引号:

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>

if errorlevel 1则必须使用比 NT4 / 2000 / XP 更旧的 Windows 才能捕获所有错误级别 1 和更高级别的错误。

要控制批处理文件的流程,请使用 goto :-(

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

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

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

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.