Capturar la salida de la consola desde una aplicación .NET (C#)
¿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).
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();
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");
}