使用process.ErrorDataReceived c#获取进程错误输出

我已经构建了一段时间使用的Form App,现在我想要捕获我的进程的StandardError以及它的standartOutput

我已经在SO和MSDN中查看了答案,但却无法正确理解

我的代码:

  public void RunProcess(string FileName, string Arguments,, bool IsPrintOutput = true) { process = new Process(); process.ErrorDataReceived += new DataReceivedEventHandler(OnDataReceivedEvent); if (IsPrintOutput) process.OutputDataReceived += new DataReceivedEventHandler(OnDataReceivedEvent); process.StartInfo.RedirectStandardOutput = true; process.StartInfo.RedirectStandardError = true; process.StartInfo.CreateNoWindow = true; process.StartInfo.UseShellExecute = false; process.StartInfo.FileName = FileName; process.StartInfo.Arguments = Arguments; if (EventWhenExit) { process.EnableRaisingEvents = true; process.Exited += new EventHandler(myprocess_Exited); } process.Start(); process.BeginOutputReadLine(); //run polling on stored logs to print them to screen PollingService(); } 

我用Iperf检查它,我看到当我用正确的参数运行它时我得到了正确的输出但是当我发送它时没有任何argumnet我看到cmd我得到了

 C:\>iperf.exe Usage: iperf [-s|-c host] [options] Try `iperf --help' for more information. 

而我的应用程序我什么都没有!

我在这里错过了什么? 谢谢

你可以在这里停止阅读! 如果你想看到内部方法的细节继续如下:

  private void OnDataReceivedEvent(object sender, DataReceivedEventArgs e) { string ProcessOutput = e.Data; ProcessLog.Add(e.Data); } private void PollingService() { var T = new Thread (()=> { while (true /* ProcessRunning*/) { if (ProcessLogIndex < ProcessLog.Count) { lock (this) { var tempList = ProcessLog.GetRange(ProcessLogIndex, ProcessLog.Count - ProcessLogIndex); ProcessLogIndex = ProcessLog.Count; foreach (var ToSend in tempList) { onDataOutputFromProcess(this, ToSend, sProcessNameID.ToString()); } } } Thread.Sleep(400); } }); T.IsBackground = true; T.Start(); } 

我在你发布的代码中的任何地方都没有看到对BeginErrorReadLine()的调用。 如果不调用该方法,则Process类实际上不会将stderr重定向到事件处理程序。

我相信以上是问题所在,但是如果你实际上在某个地方调用(并且只是没有显示它),那么值得考虑的是有一些奇怪的控制台程序没有实际使用stderr(或stdout) )用于错误输出。 相反,它们直接写入控制台窗口或其他一些非标准机制。 在这些情况下,您将无法通过重定向stderr来接收错误输出。

您可以通过在命令中重定向输出来识别这些程序,例如iperf.exe 2> foo.txt 。 stderr文件句柄为2 ,因此语法将该文件句柄重定向到名为foo.txt的文件。 如果文件为空并且您在屏幕上看到错误,那么该程序就是其中一个奇怪的程序。

但实际上,我想你可能只是忘了调用BeginErrorReadLine() 。 🙂