我们了解如果您有两个.bat
或.cmd
个文件,我们称之为foo
和bar
,则适用以下规则:
没有call
:
:: Welcome to foo.bat
@bar.bat
@echo We never get to this line because bar.bat is "chain-executed".
使用call
:
:: Welcome to foo.bat
@call bar.bat
@echo This line is executed after bar.bat returns.
我的问题是:有没有办法执行逆操作,即确保非 -batch-file可执行文件 链接?
:: Welcome to foo.bat
@chain bar.exe
@echo Even though bar is now an .exe, we never get to this line.
@echo At least, that would be the case if the "chain" command really existed.
换句话说,有没有办法在最后一个例子中执行虚构chain
命令的功能?
答案 0 :(得分:3)
必须使用命令 start 在单独的进程中运行可执行文件,并另外退出当前批处理或整个命令进程。
@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
在单独的进程中运行,导致终止当前批处理文件的处理。
如果未使用命令调用从另一个批处理文件中调用此批处理文件,则命令处理器现在完成处理批处理文件,导致退出命令处理,但使用{{调用批处理文件除外1}}使用选项cmd.exe
在完成批处理后保持命令提示符窗口打开,默认情况下不是这样。
但是如果从另一个批处理文件中使用调用调用此批处理文件,则只需处理此子批处理文件,命令处理器将继续处理父批处理文件,同时运行/K
一个单独的过程。
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.
,这导致在/B
在单独的进程中start
完成启动后终止命令处理,即使使用调用从另一个批处理文件调用当前批处理文件,即使使用参数bar.exe
的{{1}}启动批处理文件处理。
不是无条件地将两个命令开始和退出连接到运算符cmd.exe
,而是可以使用如下所示的两个变量块。
刚退出当前的批处理:
/K
退出整个命令进程:
&
退出当前批处理或整个命令处理的应用程序的这种启动当然仅在启动@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.
时才有意义,具体取决于批处理文件中的至少一个条件。
注1:
也可以使用@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
来结束当前的批处理。
注2:
如果命令是批处理子程序的一部分,goto :EOF
和exit /B
导致只退出子程序,即使用goto :EOF
调用的标签下面的代码,因为批处理子程序就像一个子程序关于批处理的主批处理文件中嵌入的批处理文件。
更多示例来演示exit /B
和call :label
的行为:
<强> Test1.bat 强>:
call
<强> Test2.bat 强>:
exit /B
<强> Test3.bat 强>:
@echo off
echo Running %~nx0
call Test2.bat
echo Finished %~nx0
在命令提示符窗口中运行@echo off
echo Running %~nx0
Test3.bat
echo Finished %~nx0
会产生输出:
@echo off
echo Finished %~nx0
因为命令处理器从Test1.bat
直接返回Running Test1.bat
Running Test2.bat
Finished Test3.bat
Finished Test1.bat
,所以行Finished Test2.bat
丢失了。
接下来,我们编译以下C代码来控制应用程序Test3.bat
:
Test1.bat
我们在以下2个批处理文件中使用Test.exe
:
<强> Test4.bat 强>:
#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;
}
<强> Test5.bat 强>:
Test.exe
在命令提示符窗口中运行@echo off
echo Running %~nx0
Test.exe 4
call Test5.bat
echo Finished %~nx0
会产生输出:
@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
执行Finished Test5.bat
直接返回Test.exe
。
但是使用6
时,如果Test4.bat
是文件扩展名为bar & exit /B
或bar
的批处理文件,或者文件扩展名为{{1}的可执行文件,那么这一点很重要}或bat
。这可以通过将cmd
的代码更改为:
exe
在命令提示符窗口中运行com
会产生输出:
Test2.bat
因此,在第二个批处理文件中附加@echo off
echo Running %~nx0
Test3.bat & exit /B
echo Finished %~nx0
后,命令处理器会将第二个批处理文件中的退出解释为第一个批处理文件的上下文中的退出。