【发布时间】:2017-08-03 09:34:21
【问题描述】:
我正在从命令行运行可执行文件,同时将 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 文件永远不会更新(即它们保持为空)。
谁能解释一下我做错了什么以及我该如何解决?
谢谢。
更新:
我能够通过从批处理文件而不是命令行运行原始命令(不包括 start /w 前缀)来解决问题。我还是想知道这个问题的原因。
【问题讨论】:
-
start没有/B选项使用进程创建标志CREATE_NEW_CONSOLE。在这种情况下,进程开始时其 PEB 中的标准句柄值设置为NULL,即使它继承了句柄表中的 out.txt 和 err.txt 句柄。然后,如果它是一个控制台应用程序(显然不是您的情况),当新控制台(即 conhost.exe)产生时,系统会将标准句柄值设置为控制台。如果 CMD 使用STARTUPINFO标准句柄,这将不是问题,这将覆盖此默认行为。 -
请注意,如果您使用
/B选项,它必须在命令行上位于/W之前,因为/B禁用等待。例如:start /b /w MyApp.exe 1>out.txt 2>err.txt.
标签: batch-file command-line stdout stderr