我正在尝试让我的 commit-build.bat 执行其他.BAT文件作为构建过程的一部分 .
commit-build.bat
内容 commit-build.bat :
"msbuild.bat" "unit-tests.bat" "deploy.bat"
这看起来很简单,但 commit-build.bat 只执行列表中的第一项( msbuild.bat ) .
msbuild.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 msbuild.bat call unit-tests.bat call deploy.bat
只需使用 call 命令!这是一个例子:
call
如果我们想打开多个命令提示,那么我们可以使用
start cmd /k
/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"
History
在古代DOS版本中,无法以递归方式执行批处理文件 . 然后引入了调用命令,该命令调用另一个cmd shell来执行批处理文件,并在完成时将执行返回给调用的cmd shell .
显然在以后的版本中,不再需要其他cmd shell了 .
在早期,许多批处理文件取决于调用批处理文件不会返回到调用批处理文件的事实 . 在没有附加语法的情况下更改该行为会破坏许多系统,如批处理菜单系统(使用菜单结构的批处理文件) .
与Microsoft的许多情况一样,因此向后兼容性是导致此行为的原因 .
Tips
如果批处理文件的名称中包含空格,请在名称周围使用引号:
call "unit tests.bat"
顺便说一句:如果你没有批处理文件的所有名称,你也可以使用它来执行此操作(它不保证批处理文件调用的正确顺序;它遵循文件系统的顺序):
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更旧的Windows来使用 if errorlevel 1 来捕获所有错误级别1和更高级别 .
if errorlevel 1
要控制批处理文件的流量,有goto :-(
if errorlevel 2 goto label2 if errorlevel 1 goto label1 ... :label1 ... :label2 ...
正如其他人所指出的那样:看一下构建系统来替换批处理文件 .
您正在调用多个批处理以编译程序 . 我理所当然地认为如果发生错误:1)批处理中的程序将以错误级别退出;2)你想知道它 .
for %%b in ("msbuild.bat" "unit-tests.bat" "deploy.bat") do call %%b|| exit /b 1
'||'测试错误级别高于0.这样所有批次都按顺序调用,但会在任何错误时停止,让屏幕保持原样,以便您查看任何错误消息 .
要在 .bat 文件中调用 .bat 文件,请使用
.bat
call foo.bat
(是的,这很愚蠢,如果你能用 foo.bat 调用它会更有意义,就像你可以从命令提示符那样,但正确的方法是使用 call . )
foo.bat
如果要一次打开多个批处理文件,可以使用call命令 . 但是,call命令会关闭当前的bat文件并转到另一个文件 . 如果你想一次打开很多,你可能想试试这个:
@echo off start cmd "call ex1.bat&ex2.bat&ex3.bat"
依此类推或重复启动 cmd “ call ...”,无论多少文件 . 这适用于 Windows 7 ,但我不确定其他系统 .
cmd
查看文件名,您是否考虑过使用NAnt或Ant(Java版本)等构建工具 . 你将获得比bat文件更多的控制权 .
在一个中运行多个脚本我遇到了同样的问题 . 我一直在第一个没有意识到它正在第一个脚本上退出而死 .
:: 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时,当前批处理文件停止,被调用的批处理文件开始执行 . 这是一种可追溯到早期MS-DOS时代的奇特行为 .
Start msbuild.bat Start unit-tests.bat Start deploy.bat
如果这不起作用,请将 start 替换为 call 或尝试此操作:
start
Start msbuild.bat Goto :1 :1 Start unit-tests.bat Goto :2 :2 Start deploy.bat
13 回答
如果我们有两个批处理脚本,aaa.bat和bbb.bat,并调用如下
执行脚本时,它将首先调用aaa.bat,等待aaa.bat的线程终止,然后调用bbb.bat .
但是如果您不想等待aaa.bat终止调用bbb.bat,请尝试使用START命令:
考试:
尝试:
只需使用
call
命令!这是一个例子:如果我们想打开多个命令提示,那么我们可以使用
/k
:必须执行 .启动许多命令提示可以如下完成 .
所有其他答案都是正确的:使用电话 . 例如:
History
在古代DOS版本中,无法以递归方式执行批处理文件 . 然后引入了调用命令,该命令调用另一个cmd shell来执行批处理文件,并在完成时将执行返回给调用的cmd shell .
显然在以后的版本中,不再需要其他cmd shell了 .
在早期,许多批处理文件取决于调用批处理文件不会返回到调用批处理文件的事实 . 在没有附加语法的情况下更改该行为会破坏许多系统,如批处理菜单系统(使用菜单结构的批处理文件) .
与Microsoft的许多情况一样,因此向后兼容性是导致此行为的原因 .
Tips
如果批处理文件的名称中包含空格,请在名称周围使用引号:
顺便说一句:如果你没有批处理文件的所有名称,你也可以使用它来执行此操作(它不保证批处理文件调用的正确顺序;它遵循文件系统的顺序):
您还可以在通话后对错误级别做出反应 . 使用:
给出一个错误级别 . 0表示正确执行 . 在调用批处理文件中,您可以使用
如果你有一个比Windows NT4 / 2000 / XP更旧的Windows来使用
if errorlevel 1
来捕获所有错误级别1和更高级别 .要控制批处理文件的流量,有goto :-(
正如其他人所指出的那样:看一下构建系统来替换批处理文件 .
您正在调用多个批处理以编译程序 . 我理所当然地认为如果发生错误:
1)批处理中的程序将以错误级别退出;
2)你想知道它 .
'||'测试错误级别高于0.这样所有批次都按顺序调用,但会在任何错误时停止,让屏幕保持原样,以便您查看任何错误消息 .
要在
.bat
文件中调用.bat
文件,请使用(是的,这很愚蠢,如果你能用
foo.bat
调用它会更有意义,就像你可以从命令提示符那样,但正确的方法是使用call
. )如果要一次打开多个批处理文件,可以使用call命令 . 但是,call命令会关闭当前的bat文件并转到另一个文件 . 如果你想一次打开很多,你可能想试试这个:
依此类推或重复启动
cmd
“call
...”,无论多少文件 . 这适用于 Windows 7 ,但我不确定其他系统 .查看文件名,您是否考虑过使用NAnt或Ant(Java版本)等构建工具 . 你将获得比bat文件更多的控制权 .
在一个中运行多个脚本我遇到了同样的问题 . 我一直在第一个没有意识到它正在第一个脚本上退出而死 .
我删除了所有11个脚本EXIT行并再次尝试,所有11个按顺序在同一个命令窗口中按顺序运行 .
使用:
不使用CALL时,当前批处理文件停止,被调用的批处理文件开始执行 . 这是一种可追溯到早期MS-DOS时代的奇特行为 .
如果这不起作用,请将
start
替换为call
或尝试此操作: