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

Lor*_*aka 8 c# process

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

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

我的代码:

        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();
        }
Run Code Online (Sandbox Code Playgroud)

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

C:\>iperf.exe
Usage: iperf [-s|-c host] [options]
Try `iperf --help' for more information.
Run Code Online (Sandbox Code Playgroud)

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

我在这里想念的是什么?谢谢

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

    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();
    }
Run Code Online (Sandbox Code Playgroud)

Pet*_*iho 9

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

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

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

但实际上,我想你可能只是忘了打电话BeginErrorReadLine().:)