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.Arguments
Para 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.