我知道如果你有两个.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
命令的function?
有必要使用命令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
在一个单独的进程中运行,导致当前批处理文件的终止处理。
如果此批处理文件不是使用命令调用从另一个批处理文件调用的 ,那么命令处理器现在将完成处理批处理文件,从而导致退出命令处理,除了使用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
导致终止命令处理用带参数/K
cmd.exe
启动。
而不是无条件地连接两个命令开始和退出与运算符&
也可以使用一个块如下所示的两个变种。
只需退出当前的批处理:
@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:如果命令是批次子程序的一部分,也就是说,由于批处理子程序就像一个子批处理文件一样,所以在call :label
下面的代码时, goto :EOF
和exit /B
结果都会退出子程序在关于批处理的主批文件内。
一些更多示例来演示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
因此,行Finished Test2.bat
丢失,因为命令处理Test3.bat
直接从Test3.bat
返回到Test1.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
因此,行Finished Test5.bat
丢失,因为命令处理程序从执行Test.exe
与参数6
直接返回到Test4.bat
。
但是,如果bar
是bat
或cmd
文件扩展名的批处理文件,或者是exe
或com
文件扩展名的可执行文件,那么使用bar & exit /B
是非常重要的。 这可以通过将Test2.bat
代码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
,命令处理器将第二批处理文件中的退出解释为第一个批处理文件的上下文中的退出。