windows - 具有不可重定向输出的实用程序 (Windows)

标签 windows stdout stderr io-redirection

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

命令行实用程序将文本发送到控制台窗口。我无法弄清楚如何将此文本重定向到文件,尽管我已经尝试了通过研究可以找到的所有方法。该实用程序似乎使用了一些奇怪的操作系统函数调用,导致文本以不受正常重定向方式影响的方式打印。我正在使用 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

对最后一个感到困惑? Turns out there are 10 output streams in Windows-land ,但这也没有完成工作。

我可以使用控制台窗口的编辑>标记选择和复制功能复制文本,但我需要以 headless 方式捕获该程序的输出,以便它可以自动化。

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

我也试过 DbgView,想也许它可能包含输出消息,但它没有。

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

最佳答案

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

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

在捕获输出方面,您可以使用 ReadConsoleOutput 做一些事情和 friend ,但这并不简单。

关于windows - 具有不可重定向输出的实用程序 (Windows),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19915834/

相关文章:

java - 关于 JFrame 的问题

windows - 批处理文件:从串行端口接收数据并将其写入 txt 文件

c# - 我如何知道 Windows 何时进入/退出 sleep 或休眠模式?

python - 重定向 sys.stdout 时 numpy savetxt 乱序

perl - 当我使用 prove -v 终止一个垂死的 Perl 测试运行时,为什么结果没有通过 STDOUT 保存到文本文件中?

java - JDK文件夹下的jre文件夹和jre文件夹有什么区别?

perl - 如何在 Log4perl 中抑制输出到 stdout 和 stderr?

python - 记录标准输出,但在每个条目上得到第二个空行

bash - 如何从 bash 脚本中将 stdout 和 stderr 重定向到文件?

linux - 将带有日期的 stderr 重定向到来自 Cron 的日志文件