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

标签 c# process

我已经构建了我使用了一段时间的 Form 应用程序,现在我想捕获我进程的 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();
        }

我用 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 (或标准输出)用于错误输出。相反,它们直接写入控制台窗口或其他一些非标准机制。在这些情况下,您将无法通过重定向 stderr 来接收错误输出。

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

但实际上,我认为您可能只是忘记调用 BeginErrorReadLine()。 :)

关于c# - 无法使用 process.ErrorDataReceived c# 获取进程错误输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28392549/

相关文章:

c++ - 我应该怎么做才能使用新的命令提示符窗口获取新进程?

c# - CMake CSharp 引用 nuget 包

c# - 在项目中找不到 Json 文件

c - 如何让父进程等待所有子进程完成?

c# 以窗口模式启动新进程

linux - 如何在 Linux 中检测进程以编程方式终止的原因

c# - 从代码中选择网格控件中的一行

c# - .NET 几何库

c# - Linux (Redhat) 上的 .NET Core 应用程序在用户主目录中创建神秘的 ".net"目录/文件

python-3.x - 如何创建一个独立的进程让python在后台运行