2010-11-06 14 views
16

Voy a ejecutar un proceso (lame.exe) para codificar un archivo WAV a MP3.Cómo capturar un STDOUT y STDERR de proceso por línea a medida que ocurren, durante la operación del proceso. (C#)

Quiero procesar el STDOUT y el STDERR del proceso para mostrar la información de progreso.

¿Debo utilizar el enhebrado? No puedo entenderlo.

Algún código de ejemplo simple sería apreciado.

Gracias

+0

me encontré con la muestra [aquí] (http://msdn.microsoft.com/en-us/library/system. diagnostics.process% 28v = vs.80% 29.aspx) que muestra cómo leer tanto stdout como stderr con subprocesos útiles. Consulte también http://cleancode.sourceforge.net/api/csharp/html/T_CleanCode_IO_ExecProcess.htm. –

Respuesta

7

Si se ejecuta a través de la clase Process, puede redirigir los flujos de lo que puede procesarlos. Puede leer stdout o stderr de forma síncrona o asíncrona. Para habilitar la redirección, establezca las propiedades de redirección apropiadas en true para las secuencias que desea redireccionar (por ejemplo, RedirectStandardOutput) y configure UseShellExecute en false. Luego puedes simplemente comenzar el proceso y leer de las transmisiones. También puede alimentar la entrada redirigiendo stdin.

por ejemplo, procesar e imprimir cualquiera que sea el proceso escribe en la salida estándar de forma sincrónica

var proc = new Process() 
{ 
    StartInfo = new ProcessStartInfo(@"SomeProcess.exe") 
    { 
     RedirectStandardOutput = true, 
     UseShellExecute = false, 
    } 
}; 
if (!proc.Start()) 
{ 
    // handle error 
} 
var stdout = proc.StandardOutput; 
string line; 
while ((line = stdout.ReadLine()) != null) 
{ 
    // process and print 
    Process(line); 
    Console.WriteLine(line); 
} 
+11

Esto no captura STDERR. –

+0

@Albin: Bueno, obviamente, no escribí el ejemplo para hacerlo. –

1

Hay an MSDN example para esto ... Aquí es una versión simplificada:

var StdOut = ""; 
var StdErr = ""; 

var stdout = new StringBuilder(); 
var stderr = new StringBuilder(); 

var psi = new ProcessStartInfo(); 
psi.FileName = @"something.exe"; 
psi.CreateNoWindow = true; 
psi.UseShellExecute = false; 
psi.RedirectStandardOutput = true; 
psi.RedirectStandardError = true; 

var proc = new Process(); 
proc.StartInfo = psi; 
proc.OutputDataReceived += (sender, e) => { stdout.AppendLine(e.Data); }; 
proc.ErrorDataReceived += (sender, e) => { stderr.AppendLine(e.Data); }; 
proc.Start(); 
proc.BeginOutputReadLine(); 
proc.BeginErrorReadLine(); 
proc.WaitForExit(10000); // per sachin-joseph's comment 

StdOut = stdout.ToString(); 
StdErr = stderr.ToString(); 
+0

Siempre llame a 'waitForExit' con un tiempo de espera para evitar la posibilidad de una espera infinita. 'waitForExit (10000)' => espera 10 segundos. –

Cuestiones relacionadas