我正在尝试让commit-build.bat执行其他.bat文件,作为构建过程的一部分。
commit-build.bat的内容:
"msbuild.bat"
"unit-tests.bat"
"deploy.bat"
这看起来很简单,但commit-build.bat只执行列表中的第一项(msbuild.bat)。
我分别运行了每个文件,没有任何问题。
我正在尝试让commit-build.bat执行其他.bat文件,作为构建过程的一部分。
commit-build.bat的内容:
"msbuild.bat"
"unit-tests.bat"
"deploy.bat"
这看起来很简单,但commit-build.bat只执行列表中的第一项(msbuild.bat)。
我分别运行了每个文件,没有任何问题。
当前回答
Use:
call msbuild.bat
call unit-tests.bat
call deploy.bat
不使用CALL时,当前批处理文件停止,调用的批处理文件开始执行。这是一种可以追溯到MS-DOS早期的奇特行为。
其他回答
有了正确的引用(有时可能很棘手):
start "" /D "C:\Program Files\ProgramToLaunch" "cmd.exe" "/c call ""C:\Program Files\ProgramToLaunch\programname.bat"""
第一个参数-标题(在本例中为空)第二个参数-/D指定起始目录,如果需要当前工作目录(例如“%~dp0”),则可以提交第三个参数-要启动的命令,“cmd.exe”第四个arg-命令的参数,其中的参数使用双引号(这是批量转义引号的方法)
如果我们有两个批处理脚本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 "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
...
正如其他人所指出的:看看构建系统来替换批处理文件。
在一个脚本中运行多个脚本时,我遇到了相同的问题。我一直让它在第一个脚本中死去,但没有意识到它在第一脚本中退出。
:: OneScriptToRunThemAll.bat
CALL ScriptA.bat
CALL ScriptB.bat
EXIT
:: ScriptA.bat
Do Foo
EXIT
::ScriptB.bat
Do bar
EXIT
我删除了所有11个脚本EXIT行,然后再次尝试,所有11个都在同一命令窗口中依次运行。
:: 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