2009-04-24 9 views
5

Estoy generando un proceso hijo que se ejecuta en una ventana visible de la consola (es un archivo por lotes que ejecuta MSBuild), y me gustaría que la salida generada por el proceso que se muestra en la ventana de la consola visible, así como capturar ese resultado para que pueda procesarlo en código. He leído varias otras preguntas y la documentación de MSDN tratar con ProcessStartInfo.RedirectStandardOutput y similares, y yo puedo capturar la salida de la corriente redirigida y procesarlo en el código bien:Capture la salida estándar y siga mostrándola en la ventana de la consola

Process msBuild = new Process(); 
msBuild.StartInfo.FileName = "Build.bat"; 
msBuild.StartInfo.UseShellExecute = false; 
msBuild.StartInfo.RedirectStandardOutput = true; 
msBuild.Start(); 
string output = msBuild.StandardOutput.ReadToEnd(); 
msBuild.WaitForExit(); 

El problema es que la la salida no se muestra en la ventana de la consola del proceso hijo; Acabo de obtener una ventana de consola en blanco en la pantalla mientras se ejecuta el proceso, que desaparece cuando termina.

Supongo que podría ocultar la ventana del proceso hijo real, y mostrar una segunda ventana a la que simplemente escribiría la salida tal como fue capturada, pero parece más trabajo de lo necesario. ¿Hay alguna manera de mostrar el resultado en la ventana de la consola y aún capturarlo para procesarlo cuando termina?

Respuesta

3

Una vez que haya redirigido el estándar, ya no estará dirigido a la consola. Para escribir en la consola, deberás hacerlo de forma manual.

Si desea visualizar la salida a medida que se ejecuta el proceso, en lugar de en un gran volcado al final, puede usar el evento "OutputDataReceived" de la clase Process.

+0

Wow - que no había visto antes OutputDataReceived. ¡Ordenado! –

+0

Esto parece responder a la pregunta de si puedo hacer que la salida se muestre en la ventana de la consola propiedad del proceso secundario y redirigir al proceso padre al mismo tiempo. Mi próxima pregunta sería, ¿es posible no redirigir la salida, y simplemente capturarlo todo desde la consola cuando el proceso finaliza? O, en caso negativo, ¿cuál es la mejor manera de crear manualmente una ventana de consola para que pueda escribir la salida redirigida a medida que se ejecuta el proceso (utilizando 'OutputDataReceived')? – mjl5007

+1

Eche un vistazo a http://msdn.microsoft.com/en-us/library/system.diagnostics.process.outputdatareceived.aspx. Tiene un ejemplo (es posible que desee apagar todos los idiomas, excepto C#) –

4

Esto es lo que he usado, sin necesidad de utilizar un hilo separado:


using(System.Diagnostics.Process proc = new System.Diagnostics.Process()) 
{ 
    proc.EnableRaisingEvents = false; 
    proc.StartInfo.RedirectStandardOutput = true; 
    proc.StartInfo.CreateNoWindow = true; 
    proc.StartInfo.UseShellExecute = false; 
    proc.StartInfo.Verb = "open"; 
    proc.StartInfo.FileName = "XXXX"; 
    proc.Start(); 
    String sLine = ""; 
    while ((sLine = proc.StandardOutput.ReadLine()) != null) 
    { 
     System.Console.WriteLine(sLine); 
    } 
    proc.WaitForExit(); //Jon Skeet was here! 
    errorCode = proc.ExitCode; 
    proc.Close(); 
} 
+0

. Estaba asumiendo que el OP deseaba que el proceso de generación continuara funcionando. No había notado la llamada a WaitForExit. Sin embargo, usaría WaitForExit en lugar de tu ciclo while: los bucles ajustados no son una buena idea. –

+0

Estoy tratando de recordar si había una razón por la que no usé WaitForExit allí. – crashmstr

+0

Al mirar mi historial de SVN, fue porque solía tenerlo como "while (! Proc.HasExited) {/ * leer cosas aquí * /}", pero no recibí todo el texto, y cuando me mudé fuera del ciclo de lectura, no pensó en cambiarlo a WaitForExit. – crashmstr

Cuestiones relacionadas