Capturar salidas estándar y error al lanzar un proceso con c#

Tras ejecutar un proceso desde nuestra aplicación en C#, podemos necesitar capturar la salida estándar y de errores, siendo a veces poco intuitivo el hacerlo de una forma adecuada, pero necesario no obstante dado que ejecutamos un proceso ajeno a nuestra aplicación, muchas veces de terceros, del cual no tenemos control interno de lo que hace más alla de un código de resultado, que en ocasaiones no está muy bien gestionado.

Por eso resulta interesante obtener las salidas standard y de error de dicho proceso, para saber que está haciendo y en caso de error, poder identificar las causas y solucionarlas.

Para interactuar con procesos, usaremos la libreria System.Diagnostics del framework .NET

 

System.Diagnostics.Process Proceso = new System.Diagnostics.Process();
Proceso.StartInfo.FileName = "nombre_archivo.bat";
Proceso.StartInfo.Arguments = "aqui irian los parametros necesarios";
Proceso.StartInfo.RedirectStandardError = true;
Proceso.StartInfo.RedirectStandardOutput = true;
Proceso.StartInfo.UseShellExecute = false;
Proceso.OutputDataReceived += Proceso_OutputDataReceived;
Proceso.ErrorDataReceived += Proceso_ErrorDataReceived; ;
Proceso.Start();
Proceso.BeginErrorReadLine();
Proceso.BeginOutputReadLine();
Proceso.WaitForExit();
if (Proceso.ExitCode != 0)
{
    // En caso de error...
}

Notese que StartInfo.Arguments recibe los parámetros que el proceso o ejecutable externo recibirá y como posteriormente es necesario fijar a true las propiedades RedirectStandardError y RedirectStandardOutput para los errores y la salida estándar, según se quiera, o ambas incluso.

 

Capturar la salida estándar y de errores de un proceso.

Una vez hecho esto se declaran los métodos que tratarán estas salidas:

 

static void Proceso_OutputDataReceived(object sender, System.Diagnostics.DataReceivedEventArgs e)
{
    // grabarmos a log, etc...
}

static void Proceso_ErrorDataReceived(object sender, System.Diagnostics.DataReceivedEventArgs e)
{
    // grabarmos a log, etc...
}

Al ejecutar ciertos procesos externos, sucede con algunos que el ejemplo anterior no funciona por la forma en que hemos declarado los parámetros del mismo, y resulta necesario instanciar un objeto ProcessStartInfo en vez de usar el heredado del propio objeto Process:

System.Diagnostics.ProcessStartInfo pci = new System.Diagnostics.ProcessStartInfo();
pci.FileName = "nombre_procesos.exe";
pci.Arguments = "argumentos...";
Proceso = System.Diagnostics.Process.Start(pci);
Proceso.WaitForExit();

 

2105 visitas.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *