在Windows批处理文件中,您可以链式执行*不是*另一个批处理文件吗?

时间:2015-12-11 17:32:49

标签: windows batch-file cmd

我们了解如果您有两个.bat.cmd个文件,我们称之为foobar,则适用以下规则:

没有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命令的功能?

1 个答案:

答案 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 :EOFexit /B导致只退出子程序,即使用goto :EOF调用的标签下面的代码,因为批处理子程序就像一个子程序关于批处理的主批处理文件中嵌入的批处理文件。

更多示例来演示exit /Bcall :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 /Bbar的批处理文件,或者文件扩展名为{{1}的可执行文件,那么这一点很重要}或bat。这可以通过将cmd的代码更改为:

来证明
exe

在命令提示符窗口中运行com会产生输出:

Test2.bat

因此,在第二个批处理文件中附加@echo off echo Running %~nx0 Test3.bat & exit /B echo Finished %~nx0 后,命令处理器会将第二个批处理文件中的退出解释为第一个批处理文件的上下文中的退出。