【问题标题】:unable to redirect output message in windows command prompt (cmd.exe)无法在 Windows 命令提示符 (cmd.exe) 中重定向输出消息
【发布时间】:2011-11-03 06:01:32
【问题描述】:

我尝试在 Windows 命令提示符下运行以下命令。

abc.exe >log.txt 2>&1

我希望 abc.exe 的所有输出都被定向到 log.txt,但它不起作用,因为 log.txt 是空的。

但是,如果我只执行abc.exe,输出将显示在 Windows 命令提示符中。

我不确定此应用程序使用的输出处理程序是什么(STDOUT 或 STDERR),但我想知道有没有一种方法可以捕获所有消息而不管处理程序如何。

【问题讨论】:

  • perl abc.exe >log.txt 2>&1 试试这个
  • 当您说“它不起作用”时,您是什么意思?程序根本不运行?它运行,但没有输出?它运行,但输出到控制台?
  • 嗨约翰斯顿,它确实会生成文件,但它是空的。输出不会进入控制台
  • 这听起来好像程序中的错误导致输出重定向时崩溃。您联系过供应商吗?
  • 你解决过这个问题吗?

标签: windows cmd io-redirection


【解决方案1】:

附录: 自 Windows 10 v1809 起,Windows finally supports pseudoconsoles。如果可用,这将提供比使用旧版控制台 API 更好的解决方案。


如果您确实需要捕获该消息,请使用console API

CreateConsoleScreenBufferSetConsoleActiveScreenBuffer 允许您切换到专用的屏幕缓冲区以避免干扰现有的。

SetConsoleScreenBufferSize 可以使缓冲区足够宽以避免行翻转。

SetConsoleCursorPosition可以根据需要设置光标位置。

运行程序后,ReadConsoleOutput 允许您读取它写入控制台的内容。

然后您可以使用GetStdHandle(STD_OUTPUT_HANDLE)SetConsoleActiveScreenBuffer 将控制台返回到原始缓冲区,并使用CloseHandle 关闭您的额外缓冲区。

【讨论】:

  • 感谢大家的讨论。事实证明 Jonston 是对的,供应商承认这是该程序中的一个错误,导致消息无法正确重定向。但是,我觉得很奇怪,错误可以打印到 Windows 控制台,但我们无法以编程方式捕获它。
  • “这是一个特性,不是错误”:(echo hello & echo world>con)>file.txtworld 回显到屏幕上,您只能将hello“捕获”到文件中。通过这种方式,您可以确保用户可以在屏幕上看到关键消息,即使代码块甚至整个脚本被重定向。
  • @Stephan,不是在这种特殊情况下:当输出被重定向时,有问题的程序没有生成 any 输出,甚至没有生成控制台。代码可能假定标准输出是一个控制台句柄(并使用特定于控制台的 API 调用),而不是自己打开一个控制台句柄。
【解决方案2】:

重定向到文件时控制台输出不可见的症状可能是由于写入标准输出的程序中缺少flush()。但是,当程序退出(优雅地)或相应的缓冲区填满并自动刷新时,输出应该是可见的。

【讨论】:

    猜你喜欢
    • 2014-02-05
    • 2010-10-22
    • 1970-01-01
    • 2012-10-03
    • 1970-01-01
    • 2020-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多