【问题标题】:How could a command line tool print to console without stdout or stderr?没有 stdout 或 stderr 的命令行工具如何打印到控制台?
【发布时间】:2017-07-20 17:17:24
【问题描述】:

我有一个 Windows CLI EXE,当我运行它时会打印到控制台。 这不是我可以修改的程序。

我将它包装在一个 gradle Exec 任务中,它显然正在运行,但没有任何内容打印到屏幕上。我没有为输出配置任何特殊的东西。

我再次直接运行程序,但使用1>2> 将stdout 和stderr 重定向到文件。

因为这个程序需要 3 个小时才能运行,所以我在一段时间后按了 Ctrl-C 并打开了重定向文件。

文件中没有通常的输出。

是否可以使用退格或其他机制来防止捕获输出?实际控制台上的输出不会清除。任何想法都会有所帮助。

【问题讨论】:

  • 类似问题stackoverflow.com/questions/25981036/… 尝试在写入控制台后添加“Console.Out.Flush()”。另外,您是否在 exec def 中做任何奇怪的事情,例如在示例 docs.gradle.org/current/dsl/org.gradle.api.tasks.Exec.html 中他们用缓冲区替换标准输出?
  • @Will 这不是我的程序
  • 您可能希望将任务的定义添加到您的问题中。在这一点上,我的知识已经走到了尽头。祝你好运。
  • @Will 它只是一个运行命令的 Exec,没有别的。此外 gradle 与它没有任何关系。 2>1> 也会发生这种情况
  • 看起来与此问题相同:stackoverflow.com/questions/7990851/… 但我无法将其作为重复项关闭,由于某种原因,我无法将其作为选项显示。水星必须逆行。

标签: windows cmd stdout


【解决方案1】:

我发现同一作者的另一个程序不需要那么长时间,所以我能够让它完成。

该程序确实写入标准输出,但直到最后才刷新。对于问题中的程序来说,这将是 3 个小时!我原以为刷新会影响控制台以及重定向流,但它似乎只影响重定向。如果您想要一个动画进度微调器或类似的东西,这是有道理的。由于我无法更新程序代码。

看来我只是卡在没有进度更新。

【讨论】:

  • 大多数标准 I/O 库在写入管道或文件时默认为完全缓冲,而在写入控制台或 TTY 时默认为行缓冲。 stderr 应始终使用无缓冲或行缓冲。如果管道标准输出不可避免地被缓冲,一种选择是将其标准输出设置为控制台屏幕缓冲区,并在程序写入时抓取其内容。
  • @eryksun 这并不重要,因为我可以接受现状,但是您是否有链接到如何“将其标准输出设置为控制台屏幕缓冲区”?特别是“它”是什么意思?
  • 这需要调用原生 WinAPI 函数,例如 CreateConsoleScreenBuffer,这可能很难或不可能集成到 Gradle 中。我不知道。
猜你喜欢
  • 2016-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-05
  • 2016-04-18
  • 2016-03-20
  • 2012-06-23
相关资源
最近更新 更多