Obtener la salida de un comando de consola

by Valeriano Tortola 4. septiembre 2007 12:50

En ocasiones, necesitamos que nuestra aplicación ejecute un comando de consola (cmd.exe) para obtener datos de alguna aplicación de consola ó simplemente para poner en marcha un servicio. La manera sencilla y tosca res ejecutar el comando redirigiendo la salida a un archivo, después abrir el archivo y coger el resultado para procesarlo.

Este ejemplo presenta la forma elegante, creamos un proceso y redirigimos los Streams de entrada y salida hacia nuestro programa para poder enviar y recibir datos de forma asíncrona.

Los comentarios describen el funcionamiento:

static void Main(string[] args)
{
  // Creamos un nuevo proceso
  Process p = new Process(); 
 
  // Apuntamos al interprete de comandos
  p.StartInfo.FileName = "cmd.exe"; 
 
  // Indico los argumentos, ‘Q’ para suprmir el eco 
  // y ‘C’ para indicar el comando que ha de ejecutar 
  // y luego finalizar.
  p.StartInfo.Arguments = "/Q /C sc query type= driver type= kernel";
 
  // Indicamos que no cree una nueva ventana.
  p.StartInfo.CreateNoWindow = true;
 
  // Aunque a simple vista deberia ser ‘true’, para poder
  // redirigir los streams tiene que ser ‘false’.
  p.StartInfo.UseShellExecute = false;
  
  // Habilitamos que se puedan lanzar el evento Exited.
  p.EnableRaisingEvents = true; 
 
  //Redirigimos la salida
  p.StartInfo.RedirectStandardOutput = true; 
 
  // Indicamos el encoding para la salida.
  p.StartInfo.StandardOutputEncoding = Encoding.ASCII;
 
  // Redirigimos la entrada.
  p.StartInfo.RedirectStandardInput = true;
 
  // Redirigimos los errores.
  p.StartInfo.RedirectStandardError = true;
 
  // Indicamos el encoding para la salida de erroes.
  p.StartInfo.StandardErrorEncoding = Encoding.ASCII; 
 
  // Subscribimos el evento donde recibiremos las líneas de salida.
  p.OutputDataReceived += new DataReceivedEventHandler(OutputDataReceived);
 
  // Subscribimos el evento donde recibiremos las líneas de salida de errores.
  p.ErrorDataReceived += new DataReceivedEventHandler(ErrorDataReceived);
 
  // Subscribimos el evento donde se nos dirá que el proceso ha finalizado
  p.Exited += new EventHandler(Exited);
 
  // Iniciamos el proceso
  p.Start();
 
  // Iniciamos la lectura asíncrona del buffer de salida.
  p.BeginOutputReadLine();
 
  // Iniciamos la lectura asíncrona del buffer de errores.
  p.BeginErrorReadLine(); 
 
  p.WaitForExit();
  Console.ReadKey();
}
 
static void Exited(object sender, EventArgs e)
{
  Console.WriteLine("Fin del proceso");
}
 
static void ErrorDataReceived(object sender, DataReceivedEventArgs e)
{
  if (!string.IsNullOrEmpty(e.Data))
      Console.WriteLine("ERR : {0}", e.Data);
}
 
static void OutputDataReceived(object sender, DataReceivedEventArgs e)
{
  if (!string.IsNullOrEmpty(e.Data))
      Console.WriteLine(e.Data);
}

Tags: , , ,

.NET 2.0 | C# 2.0

Comentarios

04/09/2007 17:49:47 #

trackback

Trackback from vtortola

Obtener la salida de un comando de consola

vtortola |

15/10/2007 13:44:34 #

ERiDeM

Hola,

El manual está genial, como todos. Siempre que tengo dudas sobre C# o .NET acudo a tu web antes que a la de MSDN, ya que lo explicas todo de una forma más práctica. Ahora solo me toca terminar mis proyectos...

Gracias y saludos!

PD. El link de "Gravatar" que tienes da un error, la página correcta ahora es: site.gravatar.com

ERiDeM España |

16/10/2007 11:32:15 #

vtortola

Gracias, es grato saber que son útiles Laughing

A ver si tengo tiempo este find de semana y hago un upgrade a la versión 1.2 de BlogEngine.NET, esta es una versión medio beta.

Un saludo.

vtortola España |

Comentarios no permitidos