【问题标题】:Output shows up in console, but disappears when redirected to file输出显示在控制台中,但在重定向到文件时消失
【发布时间】:2013-07-11 02:26:12
【问题描述】:

我正在使用测试硬盘的工具 fstest.exe。它从命令行运行良好,显示执行各种文件创建/删除/修改任务需要多长时间。从命令行以fstest.exe otherParams 运行时,通常的输出如下所示:

---
CPU Usage: 0.0%
Disk reads/sec: 0
Disk writes/sec: 0
Disk bytes/read: 0
Disk bytes/write: 0
Test duration: 0 milliseconds, 1153 ticks (3507177 ticks/sec)
---

问题是当我将输出重定向到文件时,它不显示任何内容:

fstest.exe otherParams > out.txt 创建一个空的 out.txt 文件,即使该命令执行得很好(并在其执行过程中创建了一些测试文件)。

如何强制此应用程序将输出重定向到文件?我尝试使用 PowerShell(通过 Start-Process)更仔细地查看它,以及标准输出和标准输出错误流只是空的。

我尝试过的其他事情:

cmd /c "fstest.exe otherParams > out.txt"

fstest.exe otherParams 2>&1 >> out.txt

fstest.exe otherParams | sort

powershell Start-Process -FilePath .\fstest.exe -ArgumentList @("create2", "-openexisting") -RedirectStandardOutput out.txt -RedirectStandardError err.txt -wait

(这会创建 out.txt 和 err.txt,都是空的。)

什么会导致应用程序根据它是否被重定向而改变其输出,有什么方法可以让它重定向到文件?

更新:我已经掌握了源代码。它是 C++,输出只是简单的 printf 语句。

【问题讨论】:

  • 您的程序是否正常退出(通过返回)?或者你用信号中断来打断它?可能是缓冲区没有被刷新或以这种方式退出。
  • @Gray 它总是正常退出(通过返回,退出代码为 0),但由于某种原因,它不会在重定向到文件时刷新缓冲区——仅在打印到控制台时。

标签: windows cmd


【解决方案1】:

事实证明,有问题的程序在对其执行printf 后并未刷新标准输出。显然, cmd 愿意在打印到控制台时刷新该缓冲区,而不是在将输出重定向到文件时。 (或者可能在控制台强制刷新之前文件句柄已关闭。)程序正常退出(通过返回,退出代码始终为 0)。

回答这个问题:我必须修复程序;我无法使用命令行开关或重定向来更改它。

【讨论】:

  • 哈!我是对的...我应该将其发布为答案。很高兴你修好了。
  • 有趣。我原以为程序终止会刷新与进程关联的任何 IO 缓冲区。
  • @Gray 它并没有异常退出,就我所知。退出代码始终为 0,仔细阅读源代码(诚然,没有调试器)使它看起来像正常退出。
【解决方案2】:

CMD 可以处理up to 10 file descriptors。尝试将它们重定向到单独的文件以识别您的程序写入的描述符:

fstest.exe {params} 0>out0.txt 3>out3.txt 4>out4.txt 5>out5.txt ...

【讨论】:

  • 关闭了cmd窗口,out4.txt里面有命令提示符,但其他都是空的。
【解决方案3】:

如果它写入标准错误,而不是标准输出,则重定向:

fstest.exe otherParams 2> out.txt

【讨论】:

  • 唉,运气不好。我已经尝试将两个流重定向到文件。
  • @PaulMarshall 当你弄明白这个的时候,把它贴出来——我现在真的很好奇。
猜你喜欢
  • 2017-04-22
  • 2023-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-09
  • 2021-10-21
  • 2013-12-07
相关资源
最近更新 更多