2017-08-03 183 views
0

我运行在命令行中的可执行文件,同时重定向stdoutstderr到文件:为什么“start/w”阻止进程写入stdout和stderr?

MyApp.exe 1>out.txt 2>err.txt 

文件被立即创建和更新的时候MyApp.exe完成该过程。

但是,我不知道该进程何时实际完成,因为命令行提示符在执行命令后立即变为可用。

因此,我愿积极等待的过程中完成:

start/w MyApp.exe 1>out.txt 2>err.txt 

这的确实现了等待完成的目的。

然而,out.txterr.txt文件从不更新(即它们保持空)。

有人可以请解释我做错了什么,我该如何解决?

谢谢。

UPDATE:

我能够从一个批处理文件,而不是一个命令行运行原始命令(不包括start /w前缀)来解决问题。我仍然想知道这个问题的原因。

+0

'start'没有'/ B'选项使用过程中创建标志'CREATE_NEW_CONSOLE'。在这种情况下,即使过程在其句柄表中继承了out.txt和err.txt的句柄,该过程也会从其PEB中的标准句柄值设置为NULL开始。然后,如果它是一个控制台应用程序(显然不是你的情况),当新控制台(即conhost.exe)被激活时,系统将标准句柄值设置为控制台。如果CMD使用'STARTUPINFO'标准句柄,这将不会是一个问题,它将覆盖此默认行为。 – eryksun

+0

请注意,如果您使用'/ B'选项,它必须位于命令行中'/ W'之前,因为'/ B'禁用了等待。例如:'start/b/w MyApp.exe 1> out.txt 2> err.txt'。 – eryksun

回答

1

这是因为您正在重定向STANDOUT和STORER start(它们都是空的)而不是您的应用程序的输出。你需要“拯救”整个解析的一个级别的重定向(通过转义重定向符号):

start/w MyApp.exe 1^>out.txt 2^>err.txt 
+0

我怀疑MyApp.exe将检查它的shell命令行以重定向标准I/O。你需要真正使用一个shell,例如'开始“MyApp标题”/ w cmd/c“MyApp.exe 1> out.txt 2> err.txt”'。这样做的唯一原因是如果它是一个控制台应用程序,则运行附加到新控制台的MyApp.exe,或者如果它是一个GUI应用程序,则等待它退出,否则该应用程序在从命令提示符运行时会异步执行(但不是批处理脚本,它总是等待)。否则,只需运行'MyApp.exe 1> out.txt 2> err.txt'而不使用'start'命令。 – eryksun

相关问题