Batch file 暂停并|在批处理文件(cmd)中使用

Batch file 暂停并|在批处理文件(cmd)中使用,batch-file,cmd,pipe,pause,Batch File,Cmd,Pipe,Pause,我想在上面的命令完成后执行一个命令 实际上,kkk.exe只是delay 5s,rrrrr.exe是delay 9s。我已经尝试了以下代码,它的工作,但我不知道为什么 ::run.bat echo start test ( start kkkk.exe start rrrr.exe )|pause echo ppp pause 我知道的是: |:将第一个命令的输出重定向到第二个命令的输入 似乎|将确保完成|之前的命令,以便

我想在上面的命令完成后执行一个命令

实际上,kkk.exe只是delay 5s,rrrrr.exe是delay 9s。我已经尝试了以下代码,它的工作,但我不知道为什么

 ::run.bat

    echo start test
    (

    start kkkk.exe

    start rrrr.exe

    )|pause

    echo ppp

    pause
我知道的是:

  • |
    :将第一个命令的输出重定向到第二个命令的输入

  • 似乎
    |
    将确保完成
    |
    之前的命令,以便它有
    暂停
    的输出。但只要运行这段代码,暂停回音就会显示出来

    按任意键继续…

    直接无需等待9秒(rrrr.exe)。为什么?

  • 9秒后,我不需要实际输入任何键,
    echo ppp
    将自动运行,为什么

  • 如果我将
    |
    更改为
    &
    ,我确实需要输入一个键,以便运行
    echo ppp
    ,为什么

|
:将第一个命令的输出重定向到 第二命令

似乎
|
将确保完成
|
之前的命令,以便 它有暂停输出。但只需运行此代码,暂停回显 将显示

按任意键继续…

直接无需等待9秒(rrrr.exe)。为什么?

管道的两侧都作为自己的进程执行。当然,
pause
将显示提示(这是
pause
的目的),然后等待输入(从管道的另一侧,完成后将发出“流结束”信号,该信号由
pause
解释为“回车”)。如果需要,可以使用
pause>nul

9秒后,我不需要实际输入任何键,echo ppp将 自动运行,为什么

包括在上面的解释中

如果我将|更改为&,我确实需要输入一个键,以便 将被运行,为什么

这是因为
&
仅表示“然后执行”,因此
暂停
不会收到来自先前命令的信号,因此等待键盘

注意:使用其他可执行文件时,结果可能不同。根据编程方式,
start
(甚至
start/wait
)可能会立即返回。(尤其是GUI应用程序)

|
:将第一个命令的输出重定向到 第二命令

似乎
|
将确保完成
|
之前的命令,以便 它有暂停输出。但只需运行此代码,暂停回显 将显示

按任意键继续…

直接无需等待9秒(rrrr.exe)。为什么?

管道的两侧都作为自己的进程执行。当然,
pause
将显示提示(这是
pause
的目的),然后等待输入(从管道的另一侧,完成后将发出“流结束”信号,该信号由
pause
解释为“回车”)。如果需要,可以使用
pause>nul

9秒后,我不需要实际输入任何键,echo ppp将 自动运行,为什么

包括在上面的解释中

如果我将|更改为&,我确实需要输入一个键,以便 将被运行,为什么

这是因为
&
仅表示“然后执行”,因此
暂停
不会收到来自先前命令的信号,因此等待键盘


注意:使用其他可执行文件时,结果可能不同。根据编程方式,
start
(甚至
start/wait
)可能会立即返回。(尤其是GUI应用程序)。

删除
start
(因为这告诉我们不要等待)或使用
start/wait
(如果您确实坚持使用
start
)…@aschipfl:只要没有可执行文件向控制台写入任何内容,它就可以使用简单的
start
。另请参阅我上面的评论。您忘了包括一个示例,其中给出了对该方法的两个详细解释:一个在答案中,另一个由用户eryksun进行的更技术性的描述,出现在下面的评论中……删除
start
(因为这告诉您不要等待)或使用
start/wait
(如果您确实坚持使用
start
)…@aschipfl:只要没有任何可执行文件向控制台写入任何内容,它就可以使用简单的
开始
。另请参见我上面的评论。您忘记了包含一个示例,其中给出了对该方法的两个详细解释:一个在答案中,另一个是用户eryksun的技术说明,出现在下面的评论中。。。“此外,如果其中一个可执行文件向控制台写入任何内容,
pause
将收到该信息(“任意键”)并继续…”。。。“如果可执行文件是通过
start
命令启动的,则会为其打开一个单独的
cmd.exe
控制台窗口,因此
pause
命令无法从此类可执行文件接收任何输入…@Aacini:你是对的。(错误的测试逻辑)。删除了错误的语句。但是,当我添加code
cout
start
时,启动一个新的独立进程,因此
start
ed应用程序的任何输出对管道没有影响;而
call
在同一进程内执行应用程序。因此
call
ed应用程序的任何输出都将通过管道传输到
暂停
。因此,只有使用
启动
才能同时运行多个应用程序。
调用
将始终等到应用程序结束后再继续执行下一个命令。“此外,如果其中一个可执行文件向控制台写入任何内容,
暂停
将收到该命令(“任意键”),然后继续…”如果可执行文件是通过