ProcessInfo和RedirectStandardOutput(ProcessInfo and

2019-06-17 10:30发布

我有调用另一过程中的命令窗口中的应用程序和过程具有更新的统计信息输出到控制台窗口。 我认为这是一个相当简单的操作,但我似乎无法得到它的工作。 我缺少的东西吗?

string assemblyLocation = Assembly.GetExecutingAssembly().Location;

Process process = new Process
{
    ProcessStart =
    {
        RedirectStandardOutput = true,
        UseShellExecute = false,
        WindowStyle = ProcessWindowStyle.Hidden,
        Arguments = arg,
        FileName = assemblyLocation.Substring(0, assemblyLocation.LastIndexOf("\\")) + "\\ffmpeg.exe",
        CreateNoWindow = true
    }
};

process.Start();

Console.WriteLine(process.StandardOutput.ReadToEnd());

process.WaitForExit();

理想的情况是什么,我想是因为这个过程中的输出变化,我打或数据进入,我得到的事件关闭它的读者。

任何帮助将是巨大的,我觉得这是一个新手的问​​题,但似乎失去了一些东西。

Answer 1:

我以前也经历过这个。 有时,以何种方式你调用输出到控制台过程中不使用这种输出重定向的兼容。 我在这种情况下,一直有幸能够修改外部进程来解决这个问题。

你可以尝试在另一个进程输出到控制台上运行你的代码,看看它是否工作正常。 它现在读取关于我的权利。

编辑:

我去了,拉一个代码块,我用来做这个。 这是在一个WPF应用程序会被重定向过程输出到的窗口。 注意事件绑定。 由于这是WPF我要引用我的电话将数据写出来的。 既然你不担心阻塞,OU应该能够简单地替换,与:

Console.WriteLine(e.Data);

希望这有助于!

    private static void LaunchProcess()
    {
        Process build = new Process();
        build.StartInfo.WorkingDirectory =  @"dir";
        build.StartInfo.Arguments = "";
        build.StartInfo.FileName = "my.exe";

        build.StartInfo.UseShellExecute = false;
        build.StartInfo.RedirectStandardOutput = true;
        build.StartInfo.RedirectStandardError = true;
        build.StartInfo.CreateNoWindow = true;
        build.ErrorDataReceived += build_ErrorDataReceived;
        build.OutputDataReceived += build_ErrorDataReceived;
        build.EnableRaisingEvents = true;
        build.Start();
        build.BeginOutputReadLine();
        build.BeginErrorReadLine();
        build.WaitForExit();
    }

    // write out info to the display window
    static void build_ErrorDataReceived(object sender, DataReceivedEventArgs e)
    {
        string strMessage = e.Data;
        if (richTextBox != null && !String.Empty(strMessage))
        {
            App.Instance.Dispatcher.BeginInvoke(DispatcherPriority.Send, (ThreadStart)delegate()
            {
                Paragraph para = new Paragraph(new Run(strMessage));
                para.Margin = new Thickness(0);
                para.Background = brushErrorBrush;
                box.Document.Blocks.Add(para);
            });
       }
    } 


Answer 2:

我不知道你正在运行什么问题分成,但如果你正在寻找只要它产生的作用于输出,尝试挂钩到进程的OutputDataReceived事件。 您可以指定处理程序从进程异步接收输出。 我已经成功地使用这种方法。

ProcessStartInfo info = new ProcessStartInfo(...)
info.UseShellExecute = false;
info.RedirectStandardOutput = true;
info.RedirectStandardError = true;

Process p = Process.Start(info);
p.OutputDataReceived += p_OutputDataReceived;
p.ErrorDataReceived += p_ErrorDataReceived;

p.BeginOutputReadLine();
p.BeginErrorReadLine();
p.WaitForExit();

..

void p_OutputDataReceived(object sender, DataReceivedEventArgs e)
{
  Console.WriteLine("Received from standard out: " + e.Data);
}

void p_ErrorDataReceived(object sender, DataReceivedEventArgs e)
{
  Console.WriteLine("Received from standard error: " + e.Data);
}

看到OutputDataReceived事件关闭过程的详细信息。



Answer 3:

使用lambda表达式,等等:

var info = new ProcessStartInfo(path)
{
    RedirectStandardError = true,
    RedirectStandardOutput = true,
    UseShellExecute = false,
    Verb = "runas",
};

var process = new Process
{
    EnableRaisingEvents = true,
    StartInfo = info
};

Action<object, DataReceivedEventArgs> actionWrite = (sender, e) =>
{
    Console.WriteLine(e.Data);
};

process.ErrorDataReceived += (sender, e) => actionWrite(sender, e);
process.OutputDataReceived += (sender, e) => actionWrite(sender, e);

process.Start();
process.BeginOutputReadLine();
process.BeginErrorReadLine();
process.WaitForExit();


Answer 4:

有趣的是,你不能从标准输出和标准错误的同时阅读:

如果您重定向标准输出和标准错误,然后尝试读取这两种,例如使用下面的C#代码。

[C#]

串输出= p.StandardOutput.ReadToEnd();

串错误= p.StandardError.ReadToEnd();

p.WaitForExit();

在这种情况下,如果子进程写入任何文字标准错误它会阻止的过程中,因为直到它完成从标准输出读取父进程不能从标准错误。 但是,父进程将不会从标准输出,直到进程结束读取。 推荐的解决方案,这种情况是创建两个线程,以便您的应用程序可以在一个单独的线程读取每个数据流的输出。

http://msdn.microsoft.com/en-us/library/system.diagnostics.processstartinfo.redirectstandardoutput(v=vs.71).aspx



Answer 5:

流动的代码VS2010工作

void OnOutputDataReceived(object sender, DataReceivedEventArgs e)
    {
        if (String.IsNullOrEmpty(e.Data) == false)
        {
            new Thread(() =>
            {
                this.Dispatcher.Invoke(new Action(() =>
                {
                    // Add you code here
                }));
            }).Start();
        }
    }


Answer 6:

检查您所期望的输出不被发送到StandardError的输出,而不是StandardOutput输出



文章来源: ProcessInfo and RedirectStandardOutput