输出显示在控制台中,但在重定向到文件时消失

时间:2013-07-10 02:09:11

标签: windows cmd

我正在使用测试硬盘的工具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语句。

3 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

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

fstest.exe otherParams 2> out.txt