3

I'm trying to capture the output from other applications. Capturing the output from ping works well. The variable output contains the expected output.

    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();

But when I use this code for capturing the output of expdp (which is an oracle tool for exports), the variable is empty. Runnig the same command in the console will return some output.

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

Am I missing something ?

4

2 回答 2

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();

需要注意的一点是,如果您的输出流或错误流太长,那么这种方法可能会导致死锁。

如果是这种情况,您将不得不异步读取其中一个流。

于 2013-05-09T20:23:42.440 回答
1

我曾经遇到过这个问题。最近的答案确实有道理,但我没有测试它,因为它在我遇到问题 6 个月后出现。基本上,问题似乎是 ReadToEnd() 在 p.Start() 之后的精确时刻读取,此时尚未向屏幕输出任何内容。您可以通过在 start 和 ReadToEnd() 之间放置一个长时间的睡眠来检查它。

于 2013-05-09T20:57:01.160 回答