我正在尝试捕获其他应用程序的输出。捕获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";
我错过了什么吗?
答案 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()之间进行长时间休眠来检查它。