2012-07-24 20 views
32

Estoy tratando de capturar la salida del proceso en "tiempo real" (mientras se está ejecutando). El código que uso es bastante simple (ver a continuación). Por algún extraño motivo, nunca se llama al evento OutputDataReceived. ¿Por qué?Capturar salida del proceso mediante el evento OutputDataReceived

private void button2_Click(object sender, EventArgs e) 
    { 
     // Setup the process start info 
     var processStartInfo = new ProcessStartInfo("ping.exe", "-t -n 3 192.168.100.1") 
     { 
     UseShellExecute = false, 
     RedirectStandardOutput = true 
     }; 

     // Setup the process 
     mProcess = new Process { StartInfo = processStartInfo, EnableRaisingEvents = true }; 

     // Register event 
     mProcess.OutputDataReceived += OnOutputDataReceived; 

     // Start process 
     mProcess.Start(); 
     mProcess.WaitForExit(); 
    } 

    void OnOutputDataReceived(object sender, DataReceivedEventArgs e) 
    { 
     //Never gets called... 
    } 

Respuesta

52

es necesario llamar a

mProcess.BeginOutputReadLine(); 

BeginOutputReadLine - "Comienza operaciones de lectura asíncronas en el flujo de StandardOutput redirigida de la aplicación."

+6

Además, se requiere que el proces externos para limpiar su memoria intermedia de salida en el momento en que se da salida a algo. Sin descarga, la memoria intermedia de salida podría durar hasta que se salga del proceso externo; esto hace que sea imposible para la aplicación principal capturar la salida "en vivo". –

+1

@BobKruithof: es verdad. El proceso externo realmente necesita enviar los datos, pero sin ninguna otra información es más fácil cumplir con la pregunta formulada. :) – Chris

+1

Además, algunas aplicaciones están escribiendo en ERROR estándar en lugar de OUTPUT estándar. Por lo general, no se puede hacer una diferencia al mirar la salida manualmente. Por lo tanto, intente agregar solo en caso: "RedirectStandardError = true" y "mProcess.BeginErrorReadLine();", respectivamente. – altumano

0

void ExecuteCommand(string cmdpath, string cmdargs) 
{ 
    string command = cmdpath + " " + cmdargs; 

    tabc_results.SelectTab(1); 
    DoConsole("\r\nCmd>> " + command + "\r\n"); 

    var processInfo = new System.Diagnostics.ProcessStartInfo("cmd.exe", "/c " + command); 
    processInfo.CreateNoWindow = true; 
    processInfo.UseShellExecute = false; 
    processInfo.RedirectStandardError = true; 
    processInfo.RedirectStandardOutput = true; 

    var process = System.Diagnostics.Process.Start(processInfo); 

    process.OutputDataReceived += (
     object sender, System.Diagnostics.DataReceivedEventArgs e 
    ) => DoConsole("stdout>> " + e.Data + "\r\n"); 
    //Console.WriteLine("output>>" + e.Data); 
    process.BeginOutputReadLine(); 

    process.ErrorDataReceived += (
     object sender, System.Diagnostics.DataReceivedEventArgs e 
    ) =>DoConsole("stderr>> " + e.Data + "\r\n"); 
    //Console.WriteLine("error>>" + e.Data); 
    process.BeginErrorReadLine(); 

    process.WaitForExit(); 

    DoConsole("retcode>> " + process.ExitCode.ToString() + "\r\n"); 
    //Console.WriteLine("ExitCode: {0}", process.ExitCode); 
    process.Close(); 
} 
Cuestiones relacionadas