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

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

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时,当前batch file停止,被调用的batch file开始执行。 这是一个可以追溯到早期MS-DOS时代的奇特行为

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

  call "msbuild.bat" 

历史

在古代dos版本中,不可能recursion地执行batch file。 然后引入调用命令,调用另一个cmd shell来执行batch file,并在完成时将执行返回到调用的cmd shell。

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

在早期,许多batch file依赖于调用batch file不会返回到调用batch file的事实。 不用额外的语法来改变这个行为就会破坏许多系统,比如批处理菜单系统(使用菜单结构的batch file)。

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

提示

如果batch file的名称中有空格,请在名称周围使用引号:

 call "unit tests.bat" 

顺便说一句:如果你没有所有的batch file的名字,你也可以用来做到这一点:(不保证batch file调用的正确顺序,按照文件系统的顺序)

 FOR %x IN (*.bat) DO call "%x" 

通话结束后,您也可以对错误级别做出反应。 使用

 exit /B 1 # or any other integer value in 0..255 

给出一个错误级别。 0表示正确执行。 在调用batch file中,您可以使用

 if errorlevel neq 0 <batch command> 

如果错误级别1,如果你有一个较旧的Windows,然后NT4 / 2000 / XP捕获所有错误级别1和更高,请使用。

要控制一个batch file的stream程,有goto 🙁

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

正如其他人指出:看看构build系统来取代batch file。

如果我们想打开多个命令提示符然后我们使用

 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. 

尝试

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

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

 call foo.bat 

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

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

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

'||' testing的错误级别高于0.这样所有的批次都会按顺序调用,但是会在出现任何错误时停止,让屏幕保持原样显示错误信息。

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

看你的文件名,你有没有考虑使用像南或ant(Java版本)的构build工具。 你会得到比bat文件更多的控制

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

如果这不起作用,请replacestart call或试试这个:

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

如果要一次打开许多batch file,则可以使用call命令,但是如果要一次打开多个文件,call命令将closures当前的bat文件并转到另一个文件,可能需要尝试

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

等等,或者重复启动cmdcall …”,然而许多文件。 这对于WIN7不适用于其他系统。

在一个运行多个脚本我有同样的问题。 我第一个死的时候一直没有意识到它正在退出第一个剧本。

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

我删除了所有11个脚本的EXIT行,然后再次尝试,并且在同一个命令窗口中一次只运行一个。

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

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

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

干杯!