【问题标题】:Why does "start /w" prevent process from writing to stdout and stderr?为什么“start /w”会阻止进程写入标准输出和标准错误?
【发布时间】:2017-08-03 09:34:21
【问题描述】:

我正在从命令行运行可执行文件,同时将 stdoutstderr 重定向到文件:

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

文件会立即创建,并在MyApp.exe 的进程完成时更新。

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

因此我想积极等待该过程的完成:

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

这样确实达到了等待完成的目的。

但是,out.txterr.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


【解决方案1】:

这是因为您正在重定向 start 的 STDOUT 和 STDERR(它们都是空的)而不是应用程序的输出。您需要跨一级解析“保存”重定向(通过转义重定向符号):

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

【讨论】:

  • 我怀疑 MyApp.exe 是否会检查其命令行,以便 shell 操作员重定向标准 I/O。如果需要,您需要实际使用外壳,例如start "MyApp Title" /w cmd /c "MyApp.exe 1>out.txt 2>err.txt"。这样做的唯一原因是如果它是控制台应用程序,则运行附加到新控制台的 MyApp.exe,或者如果它是 GUI 应用程序,则等待它退出,否则从命令提示符运行时会异步执行(但不是在一个批处理脚本,它总是等待)。否则,您只需运行MyApp.exe 1>out.txt 2>err.txt 而不使用start 命令。
猜你喜欢
  • 1970-01-01
  • 2023-03-15
  • 2014-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多