如何在.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"
等等,或者重复启动cmd
“ call
…”,然而许多文件。 这对于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
干杯!