我运行在命令行中的可执行文件,同时重定向stdout
和stderr
到文件:为什么“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.txt
和err.txt
文件从不更新(即它们保持空)。
有人可以请解释我做错了什么,我该如何解决?
谢谢。
UPDATE:
我能够从一个批处理文件,而不是一个命令行运行原始命令(不包括start /w
前缀)来解决问题。我仍然想知道这个问题的原因。
'start'没有'/ B'选项使用过程中创建标志'CREATE_NEW_CONSOLE'。在这种情况下,即使过程在其句柄表中继承了out.txt和err.txt的句柄,该过程也会从其PEB中的标准句柄值设置为NULL开始。然后,如果它是一个控制台应用程序(显然不是你的情况),当新控制台(即conhost.exe)被激活时,系统将标准句柄值设置为控制台。如果CMD使用'STARTUPINFO'标准句柄,这将不会是一个问题,它将覆盖此默认行为。 – eryksun
请注意,如果您使用'/ B'选项,它必须位于命令行中'/ W'之前,因为'/ B'禁用了等待。例如:'start/b/w MyApp.exe 1> out.txt 2> err.txt'。 – eryksun