输出不可重定向的实用程序(Windows)

Mik*_*ark 5 windows stdout stderr io-redirection

我正在使用Microsoft命令行实用程序执行任务。我认为,实用程序的功能及其执行的任务的具体细节相对来说并不重要。这很重要:

命令行实用程序将文本发送到控制台窗口。尽管我尝试了所有可以通过研究找到的方法,但是我无法弄清楚如何将文本重定向到文件。似乎该实用程序正在使用一些奇怪的OS函数调用,从而导致以不受常规重定向方式约束的方式来打印文本。我正在使用Windows 7 cmd.exe控制台窗口。

这些构造都没有重定向有问题的文本输出:

util.exe >log.txt
util.exe 2>err.txt
util.exe >log.txt 2>&1
util.exe 1>log.txt 2>err.txt
util.exe 1>log.txt 2>err.txt 3>3.txt 4>4.txt 5>5.txt 6>6.txt 7>7.txt 8>8.txt 9>9.txt
Run Code Online (Sandbox Code Playgroud)

对最后一个感到困惑吗? 事实证明,在Windows-land中有10个输出流,但这也没有完成任务。

我可以使用控制台窗口的“编辑”>“标记选择并复制”功能来复制文本,但是我需要以无头方式捕获该程序的输出,以便使其自动化。

我找不到任何专门绕过重定向打印到控制台的OS函数调用。是否存在这样的功能?该实用程序如何设法规避重定向?我可以使用什么方法来捕获该实用程序的输出?

我还尝试了DbgView,认为可能包含输出消息,但没有。

该实用程序不是图形实用程序。很显然,这是一个文本模式程序,可能是用C或C ++编写的。它是由Microsoft编写的。

Har*_*ton 1

它没有什么特别神奇的地方。尽管 C 库默认将输出发送到标准输出句柄,但程序没有义务这样做;您始终可以打开自己的控制台输出设备句柄 ( CONOUT$)。

CreateFile有关控制台设备的更多信息,请参阅 文​​档。

在捕获输出方面,您也许可以与ReadConsoleOutput朋友一起做一些事情,但这并不简单。

  • 覆盖标准流甚至可以在纯批处理中工作:`( echo hello>con ) >xy` (2认同)
  • [Pseudoconsole API](https://learn.microsoft.com/en-us/windows/console/creating-a-pseudoconsole-session) 使 `ReadConsoleOutput` 过时。 (2认同)