Saltar al contenido

Process.start: ¿cómo obtener la salida?

Puede que se de el caso de que halles alguna incompatibilidad con tu código o proyecto, recuerda probar siempre en un ambiente de testing antes subir el código al trabajo final.

Solución:

Cuando creas tu Process conjunto de objetos StartInfo adecuadamente:

var proc = new Process 

    StartInfo = new ProcessStartInfo
    
        FileName = "program.exe",
        Arguments = "command line arguments to your executable",
        UseShellExecute = false,
        RedirectStandardOutput = true,
        CreateNoWindow = true
    
;

luego inicie el proceso y lea de él:

proc.Start();
while (!proc.StandardOutput.EndOfStream)

    string line = proc.StandardOutput.ReadLine();
    // do something with line

Puedes usar int.Parse() o int.TryParse() para convertir las cadenas a valores numéricos. Puede que tengas que hacer algunos string manipulación primero si hay caracteres numéricos no válidos en las cadenas que lee.

Puede procesar su salida sincrónicamente o asincrónicamente.

1. Ejemplo síncrono

static void runCommand()

    Process process = new Process();
    process.StartInfo.FileName = "cmd.exe";
    process.StartInfo.Arguments = "/c DIR"; // Note the /c command (*)
    process.StartInfo.UseShellExecute = false;
    process.StartInfo.RedirectStandardOutput = true;
    process.StartInfo.RedirectStandardError = true;
    process.Start();
    //* Read the output (or the error)
    string output = process.StandardOutput.ReadToEnd();
    Console.WriteLine(output);
    string err = process.StandardError.ReadToEnd();
    Console.WriteLine(err);
    process.WaitForExit();

Nota que es mejor procesar ambos producción y errores: deben manejarse por separado.

StartInfo.ArgumentsPara algunos comandos (aquí /c ) debe agregar el WaitForExit()directiva, de lo contrario el proceso se congela en el

.

static void runCommand() 

    //* Create your Process
    Process process = new Process();
    process.StartInfo.FileName = "cmd.exe";
    process.StartInfo.Arguments = "/c DIR";
    process.StartInfo.UseShellExecute = false;
    process.StartInfo.RedirectStandardOutput = true;
    process.StartInfo.RedirectStandardError = true;
    //* Set your output and error (asynchronous) handlers
    process.OutputDataReceived += new DataReceivedEventHandler(OutputHandler);
    process.ErrorDataReceived += new DataReceivedEventHandler(OutputHandler);
    //* Start process and handlers
    process.Start();
    process.BeginOutputReadLine();
    process.BeginErrorReadLine();
    process.WaitForExit();


static void OutputHandler(object sendingProcess, DataReceivedEventArgs outLine) 

    //* Do your stuff with the output (write to console/log/StringBuilder)
    Console.WriteLine(outLine.Data);

2. Ejemplo asíncrono

//* Set your output and error (asynchronous) handlers
process.OutputDataReceived += (s, e) => Console.WriteLine(e.Data);
process.ErrorDataReceived += (s, e) => Console.WriteLine(e.Data);

Si no necesita realizar operaciones complicadas con la salida, puede omitir el método OutputHandler, simplemente agregando los controladores directamente en línea: Muy bien, para cualquiera que quiera leer tanto los errores como las salidas, pero obtiene interbloqueos StandardOutput con cualquiera de las soluciones, proporcionadas en otras respuestas (como yo), aquí hay una solución que construí después de leer la explicación de MSDN para

propiedad.

static void runCommand()

    //* Create your Process
    Process process = new Process();
    process.StartInfo.FileName = "cmd.exe";
    process.StartInfo.Arguments = "/c DIR";
    process.StartInfo.UseShellExecute = false;
    process.StartInfo.RedirectStandardOutput = true;
    process.StartInfo.RedirectStandardError = true;
    //* Set ONLY ONE handler here.
    process.ErrorDataReceived += new DataReceivedEventHandler(ErrorOutputHandler);
    //* Start process
    process.Start();
    //* Read one element asynchronously
    process.BeginErrorReadLine();
    //* Read the other one synchronously
    string output = process.StandardOutput.ReadToEnd();
    Console.WriteLine(output);
    process.WaitForExit();


static void ErrorOutputHandler(object sendingProcess, DataReceivedEventArgs outLine) 

    //* Do your stuff with the output (write to console/log/StringBuilder)
    Console.WriteLine(outLine.Data);

La respuesta se basa en el código de T30:

Si te apasiona este mundo, eres capaz de dejar una crónica acerca de qué le añadirías a esta noticia.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

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