捕获的输出为空

时间:2013-05-09 20:19:28

标签: c#

我正在尝试捕获其他应用程序的输出。捕获ping的输出效果很好。变量输出包含预期的输出。

    var p = new Process();
    p.StartInfo.FileName = "ping";
    p.StartInfo.Arguments = "www.google.com";
    p.StartInfo.UseShellExecute = false;
    p.StartInfo.RedirectStandardOutput = true;
    p.StartInfo.CreateNoWindow = true;
    p.Start();

    var output = p.StandardOutput.ReadToEnd();
    p.WaitForExit();

但是当我使用此代码捕获expdp的输出(这是导出的oracle工具)时,该变量为空。在控制台中运行相同的命令将返回一些输出。

    p.StartInfo.FileName = "expdp";
    p.StartInfo.Arguments = "help=y";

我错过了什么吗?

2 个答案:

答案 0 :(得分:7)

尝试检查StandardError信息流并查看是否有任何内容

var p = new Process();
p.StartInfo.FileName = "expdp";
p.StartInfo.Arguments = "help=y";
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.RedirectStandardError = true;
p.StartInfo.CreateNoWindow = true;
p.Start();

var error = p.StandardError.ReadToEnd();
var output = p.StandardOutput.ReadToEnd();
p.WaitForExit();

有一点需要注意,如果您的输出流或错误文件太长,则此方法可能会导致死锁。

如果是这种情况,则必须异步读取其中一个流。

答案 1 :(得分:1)

我有this problem once。最近的答案确实有意义,但我没有测试它,因为它在我遇到问题后6个月出现。基本上问题似乎是ReadToEnd()在p.Start()之后的精确时刻读取,其中没有任何内容输出到屏幕。您可以通过在start和ReadToEnd()之间进行长时间休眠来检查它。