vtortola.NET Logo
Obtener la salida de un comando de consola

Obtener la salida de un comando de consola

por vtortola martes, 04 de septiembre de 2007

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);
}

Actualmente calificado 5.0 por 9 persona(s)

  • Currently 5/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Tags: , , ,

.NET 2.0 | C# 2.0

Related posts

Comentarios

septiembre 4. 2007 07:49

trackback

Trackback from vtortola

Obtener la salida de un comando de consola

vtortola

octubre 15. 2007 03:44

Gravatar

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 es

octubre 16. 2007 01:32

Gravatar

Gracias, es grato saber que son útiles :D

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 es

Comments are closed

Powered by BlogEngine.NET 1.1.1.8
This theme is a variation of Mads Kristensen by Valeriano Tórtola

Valeriano Tórtola

Personal Ver perfil
E-mail Enviar correo
LinkedIn LinkedIn
Fotos Fotos
MCPD

Publicidad

Posts recientes

Disclaimer

Las opiniones mostradas aqui son mis opniones y no representan el punto de vista de mi empresa en ninguna forma.

Creative Commons License

Esta obra está bajo una licencia de Creative Commons

Locations of visitors to this page

© Copyright 2010

Sign in

Calendario

<<  marzo 2010  >>
lumamijuvido
22232425262728
1234567
891011121314
15161718192021
22232425262728
2930311234

Ver en calendario extendido