【问题标题】:Reading Pipe from cmd.exe that uses "start" builtin从使用“start”内置的 cmd.exe 读取管道
【发布时间】:2011-02-23 18:39:03
【问题描述】:

我正在尝试使用 WScript.exe 为当前用户(在 Windows 上)“留言”,而不是等待用户确认该消息。

我的想法是创建一个新进程,使用“start”内置(它通常会打开一个新窗口并将执行控制权返回给调用者)并使用一个简短的脚本调用 WScript 以在屏幕上打开一个消息框,然后退出。

除非我尝试从该脚本打开管道(并阅读它),否则这可以正常工作。如果我尝试从管道中读取,则读取 I/O 永远不会在 wscript.exe 退出之前获得 EOF,即使该程序在“开始”命令之后继续执行。

这是一个例子:

test.vbs

WScript.Echo "Hello World!"

invoke.cmd

start wscript.exe //nologo test.vbs
@echo Exiting...
exit /b

如果我在命令提示符下运行 invoke.cmd,WScript 窗口将打开并且控制返回到提示符。

但是,如果我尝试将输出通过管道传输到命令(尝试读取管道),则子命令似乎永远不会看到管道已关闭,直到 wscript.exe 退出。 p>

但是,此行为不需要 WScript.exe。只要“start”创建的进程仍在运行,它似乎就会以这种方式运行。我可以使用“cmd.exe /k”获得相同的行为。

invoke2.cmd

start cmd /k date /t
@echo Exiting...
exit /b

尝试从invoke2.cmd 中的管道读取数据会阻塞,直到“start”-ed 进程结束。

我没有看到任何用于“启动”的命令行参数声称可以控制这样的行为,而且我真的不明白为什么使用“启动”来创建新进程/窗口的 cmd.exe 不会' t 退出,直到“开始”窗口退出。

奇怪的是,如果我将输出重定向到一个文件,一切都会奏效。它只是不适用于管道。

有什么想法吗?

【问题讨论】:

    标签: pipe cmd


    【解决方案1】:

    由于您使用的是 wscript.exe,它会在您的 Echo 命令上弹出一个消息框。尝试运行

    start cscript.exe //nologo test.vbs

    cscript.exe是命令行版本,所以会输出到命令行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-27
      • 1970-01-01
      • 1970-01-01
      • 2023-03-06
      • 1970-01-01
      • 2022-11-10
      相关资源
      最近更新 更多