【问题标题】:Prevent cmd.exe from child output forwarding防止 cmd.exe 子输出转发
【发布时间】:2014-05-08 13:47:17
【问题描述】:
cmd.exe /C start  calc.exe > NUL 2> NUL
echo This line is shown immediately! 
cmd.exe /C start calc.exe > NUL 2> NUL | find "Parsing whole output"
echo This line won't execute until second calc.exe is closed! Why???

如何从 cmd.exe 启动后台应用程序,以便在退出后立即关闭 cmd 的输出(忽略子状态及其输出)?

Cmd的输出被处理了,但是我不关心child的进程输出。

定义

  • 父级 - 调用子级并使用其输出的脚本或程序
  • child - 一个 cmd 命令或批处理文件,可选择产生一些输出
  • grandchild - 一个由孩子调用并永远运行的程序

父母和孙子女具有固定的语义,不在此问题范围内。我正在尝试创建一个孩子。

接受标准

编写一个子批处理脚本,如果调用该脚本:

REM This is a parent
call child.cmd | find "something"
echo "Accepted!"
  • 让 calc.exe 孙子永远运行
  • 立即返回,让 echo 指令执行

【问题讨论】:

标签: io cmd


【解决方案1】:

已编辑 - 我将 OP 代码与我的代码混合在一起,但解释错误。我的错

第一行调用一个控制台应用程序 (cmd.exe),当前运行批处理文件的控制台实例将等待它结束。新的 cmd 将启动一个 windows 应用程序,而无需等待它结束并自行结束,因此当前批处理文件中的执行将继续。

第二行在启动 calc 命令的新 cmd 实例和 find 命令之间创建了一个管道。新的 cmd 实例启动一个 Windows 应用程序,而无需等待它结束并自行结束,将 calc 和 find 命令绑定在由第一个 cmd 实例处理的管道中。直到管道中涉及的至少一个进程结束,管道才处于活动状态,并且处理管道的第一个 cmd 实例无法继续。

start "" /b cmd.exe /C "calc.exe > NUL 2> NUL | find "Parsing whole output" "

启动一个控制台分离的cmd实例不会等待进程结束继续处理当前的批处理文件

如果原来的行改为(这是我一开始检查的那一行,也是我的错误的根源)

cmd.exe /C  " start calc.exe > NUL 2> NUL | find "Parsing whole output"  "

然后管道将由第二个 cmd 实例处理,并且直到三个进程(第二个 cmd、calc、find)中的任何一个结束,第一个 cmd 实例将不会继续,因为它正在执行等待它的控制台应用程序结束,直到管道结束才会结束。

EDITED看到了新的定义和验收标准,这是child.cmd

@if (@This==@IsBatch) @then
@echo off
    wscript //E:JScript "%~dpnx0"
    exit /b
@end
WScript.CreateObject('WScript.Shell').Run('calc.exe');

从 cmd 开始,任何启动的进程都会继承输入和输出句柄的重定向,直到我们能够从 cmd 中获取某些内容。因此,启动一个进程(在这种情况下为wscript,但cscript 也可以工作)并从这里开始所需的元素(在这种情况下为calc),我们达到了所需的行为。

【讨论】:

  • 第二个 cmd 也会立即终止。这可以通过任务管理器进行验证。管道由子 cmd 处理的想法让我感到怀疑。
  • @Basilevs,你是对的,在测试时我将我的更改之一作为原始行。我的错。答案已更正。
  • 你分离查找,它提供分离指示器。请重构代码看起来像 your_arbitary_which_starts_calc_exe |找到“输出”。 Find 不应分离 - 它用于指示子进程不会挂起其输出的使用者。
  • 我的意思是 - find 用于表示孙子不影响子输出的消费者。对不起。
  • @Basilevs,对不起,我什么都不懂。但是阅读您的最后一条评论,我意识到我不知道您希望 find 命令处理哪个输出,如果是第二个 cmd 输出、calc 输出或什么,也不知道代码的目的/含义是什么。我想我是在绕着一些没有明确定义的东西转圈子。您能否更好地定义代码所需的功能是什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-30
  • 2011-09-04
  • 1970-01-01
  • 1970-01-01
  • 2011-12-13
  • 2015-01-18
  • 1970-01-01
相关资源
最近更新 更多