为了在单独的进程中运行可执行文件,需要使用命令start,并且还需要exit当前批处理或整个命令过程。
@echo off
echo Welcome to %~nx0
start "Title" bar.exe & exit /B
echo Even though bar is now an .exe, we never get to this line.
这个批处理文件会启动
bar.exe
,在新的控制台窗口中打开它,并将
Title
作为窗口标题,如果可执行文件是控制台应用程序的话。
然后,在
start
完成后,命令处理器无条件地执行
exit /B
,而
bar.exe
在单独的进程中运行,导致当前批处理文件的处理终止。
如果这个批处理文件没有使用命令
call从另一个批处理文件中调用,那么命令处理器现在完成了批处理文件的处理,结果退出命令处理,除非使用
cmd.exe
选项
/K
调用批处理后,保持命令提示符窗口在批处理结束后仍然打开,但默认情况下不会这样做。
但是,如果这个批处理文件是从另一个批处理文件中使用
call调用的,那么只有这个子批处理文件的处理完成后,命令处理器才会继续处理父批处理文件,而
bar.exe
则在一个单独的进程中运行。
@echo off
echo Welcome to %~nx0
start "Title" bar.exe & exit
echo Even though bar is now an .exe, we never get to this line.
在这个批处理代码中,命令
exit没有选项
/B
,这将导致在单独的进程中启动
bar.exe
后,即使当前批处理文件是通过另一个批处理文件使用
call调用的,即使批处理文件处理是通过带有参数
/K
的
cmd.exe
启动的,也会终止命令处理。
可以像下面显示的两个变体那样使用块,而不是无条件地使用运算符&
连接两个命令start和exit。
只需退出当前批处理:
@echo off
echo Welcome to %~nx0
(
start "Title" bar.exe
exit /B
)
echo Even though bar is now an .exe, we never get to this line.
退出整个命令进程:
@echo off
echo Welcome to %~nx0
(
start "Title" bar.exe
exit
)
echo Even though bar is now an .exe, we never get to this line.
如果bar.exe
是根据批处理文件中至少一个条件启动的,则使用退出当前批处理或整个命令处理的方式启动应用程序是有意义的。
注1:
也可以使用goto :EOF
代替exit /B
来结束当前批处理。
注2:
goto :EOF
和exit /B
都会导致子程序退出,如果该命令是批处理子程序的一部分,即通过call :label
调用标签下面的代码,因为批处理子程序就像嵌入在主批处理文件中的子批处理文件。
以下是一些示例,以演示call
和exit /B
的行为:
Test1.bat:
@echo off
echo Running %~nx0
call Test2.bat
echo Finished %~nx0
Test2.bat:
@echo off
echo Running %~nx0
Test3.bat
echo Finished %~nx0
Test3.bat:
@echo off
echo Finished %~nx0
在命令提示符窗口中运行
Test1.bat
会产生输出:
Running Test1.bat
Running Test2.bat
Finished Test3.bat
Finished Test1.bat
因此,由于命令处理器直接从Test3.bat
返回到Test1.bat
,所以缺少Finished Test2.bat
这一行。
接下来,我们将编译以下C代码为控制台应用程序Test.exe
:
#include <stdio.h>
int main (int argc, char* argv[])
{
if(argc > 1)
{
printf("Running %s with argument %s\n",argv[0],argv[1]);
}
else
{
printf("Running %s without an argument\n",argv[0]);
}
return 0;
}
我们使用Test.exe
在以下两个批处理文件中:
Test4.bat:
@echo off
echo Running %~nx0
Test.exe 4
call Test5.bat
echo Finished %~nx0
Test5.bat:
@echo off
echo Running %~nx0
Test.exe 5
Test.exe 6 & exit /B
echo Finished %~nx0
在命令提示符窗口中运行Test4.bat
会产生以下输出:
Running Test4.bat
Running Test.exe with argument 4
Running Test5.bat
Running Test.exe with argument 5
Running Test.exe with argument 6
Finished Test4.bat
因为命令处理器直接返回到Test4.bat并执行了参数为6的Test.exe,所以缺失了Finished Test5.bat行。
但是,如果使用bar&exit /B,那么bar是一个批处理文件(文件扩展名为bat或cmd),还是一个可执行文件(文件扩展名为exe或com)就变得非常重要。这可以通过将Test2.bat的代码更改为以下内容来演示:
@echo off
echo Running %~nx0
Test3.bat & exit /B
echo Finished %~nx0
在命令提示符窗口中运行
Test1.bat
,将输出以下信息:
Running Test1.bat
Running Test2.bat
Finished Test3.bat
在第二个批处理文件中添加
exit /B
后,命令处理器将在第一个批处理文件的上下文中解释第二个批处理文件中的
exit。
foo.bat
时,它会保留其命令行窗口并等待bar.exe
完成。 - jez