Capturar la salida de la consola desde una aplicación .NET (C#)

Resuelto Gripsoft asked hace 15 años • 8 respuestas

¿Cómo invoco una aplicación de consola desde mi aplicación .NET y capturo toda la salida generada en la consola?

(Recuerde, no quiero guardar la información primero en un archivo y luego volver a publicarla, ya que me encantaría recibirla en vivo).

Gripsoft avatar Oct 09 '08 18:10 Gripsoft
Aceptado

Esto se puede lograr fácilmente utilizando la propiedad ProcessStartInfo.RedirectStandardOutput . Un ejemplo completo está contenido en la documentación de MSDN vinculada; La única advertencia es que es posible que también deba redirigir el flujo de error estándar para ver todos los resultados de su aplicación.

Process compiler = new Process();
compiler.StartInfo.FileName = "csc.exe";
compiler.StartInfo.Arguments = "/r:System.dll /out:sample.exe stdstr.cs";
compiler.StartInfo.UseShellExecute = false;
compiler.StartInfo.RedirectStandardOutput = true;
compiler.Start();    

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

compiler.WaitForExit();
mdb avatar Oct 09 '2008 11:10 mdb

Esta es una pequeña mejora con respecto a la respuesta aceptada de @mdb . Específicamente, también capturamos la salida de error del proceso. Además, capturamos estos resultados a través de eventos porque ReadToEnd()no funciona si desea capturar tanto el error como el resultado normal. Me tomó un tiempo hacer que esto funcionara porque en realidad también requiere BeginxxxReadLine()llamadas después Start().

Manera asincrónica:

using System.Diagnostics;

Process process = new Process();

void LaunchProcess()
{
    process.EnableRaisingEvents = true;
    process.OutputDataReceived += new System.Diagnostics.DataReceivedEventHandler(process_OutputDataReceived);
    process.ErrorDataReceived += new System.Diagnostics.DataReceivedEventHandler(process_ErrorDataReceived);
    process.Exited += new System.EventHandler(process_Exited);

    process.StartInfo.FileName = "some.exe";
    process.StartInfo.Arguments = "param1 param2";
    process.StartInfo.UseShellExecute = false;
    process.StartInfo.RedirectStandardError = true;
    process.StartInfo.RedirectStandardOutput = true;

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

    //below line is optional if we want a blocking call
    //process.WaitForExit();
}

void process_Exited(object sender, EventArgs e)
{
    Console.WriteLine(string.Format("process exited with code {0}\n", process.ExitCode.ToString()));
}

void process_ErrorDataReceived(object sender, DataReceivedEventArgs e)
{
    Console.WriteLine(e.Data + "\n");
}

void process_OutputDataReceived(object sender, DataReceivedEventArgs e)
{
    Console.WriteLine(e.Data + "\n");
}
Shital Shah avatar Sep 21 '2016 18:09 Shital Shah