从cmd.exe读取管道,使用“start”内置

时间:2011-02-23 18:39:03

标签: pipe cmd

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

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

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

以下是一个例子:

test.vbs

WScript.Echo "Hello World!"

invoke.cmd

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

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

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

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

invoke2.cmd

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

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

我没有看到任何命令行参数“启动”声称管理这样的行为,我真的不明白为什么使用“启动”来创建新进程/窗口的cmd.exe赢了t退出,直到退出“开始”窗口。

奇怪的是,如果我将输出重定向到文件,事情就会起作用。它只是不适用于管道。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

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

start cscript.exe //nologo test.vbs

cscript.exe是命令行版本,因此它将输出到命令行。