Ejecutar comandos en el CMD de Windows desde C#


El ejecutar un proceso desde .NET no es muy complicado (no solo la consola) gracias a que se tienen las clases de “System.Diagnostics” y en particular la clase “Process”, que permite realizar llamadas a Procesos externos.
Para este ejemplo voy a crear una aplicación muy simple llamada CMD Executer que su única función es ejecutar comandos CMD.
Primero vamos a crear una clase estática llamada “ExecuteCommand” que recibe como parámetro un comando como cadena de texto:
        static void ExecuteCommand(string _Command)
        {
            //Indicamos que deseamos inicializar el proceso cmd.exe junto a un comando de arranque. 
            //(/C, le indicamos al proceso cmd que deseamos que cuando termine la tarea asignada se cierre el proceso).
            //Para mas informacion consulte la ayuda de la consola con cmd.exe /? 
            System.Diagnostics.ProcessStartInfo procStartInfo = new System.Diagnostics.ProcessStartInfo("cmd""/c " + _Command);
            // Indicamos que la salida del proceso se redireccione en un Stream
            procStartInfo.RedirectStandardOutput = true;
            procStartInfo.UseShellExecute = false;
            //Indica que el proceso no despliegue una pantalla negra (El proceso se ejecuta en background)
            procStartInfo.CreateNoWindow = false;
            //Inicializa el proceso
            System.Diagnostics.Process proc = new System.Diagnostics.Process();
            proc.StartInfo = procStartInfo;
            proc.Start();
            //Consigue la salida de la Consola(Stream) y devuelve una cadena de texto
            string result = proc.StandardOutput.ReadToEnd();
            //Muestra en pantalla la salida del Comando
            Console.WriteLine(result);
        }

Nuestro siguiente paso, para que parezca una consola verdadera es crear un ciclo while infinito, que se detenga cuando ingresemos el comando “Salir”:
        static void Main(string[] args)
        {
            string command = "dir";
            Console.WriteLine("CMD Executer V.0.1");
            Console.WriteLine("Last Release 05 - Febraury - 2012");
 
            while (true)
            {
                Console.Write("#:");
                command = Console.ReadLine();
                if (command == "Salir" || command == "salir")
                {
                    break;
                }
                ExecuteCommand(command);
            }
        }
Ahora cuando hagamos correr nuestro programa tendremos lo siguiente:
 Suerte!

9 comentarios

Muchas gracias! Realmente me fue de ayuda.

Reply
Este comentario ha sido eliminado por el autor.

Magnifico post, realmente me sacaste de un aprieto! me gustaría saber si hay alguna forma de que no sea visible la ventana de cmd, al momento de ejecutar la función? Muchas Gracias.!

Reply

En las propiedades del processInfo establece esto:

WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;

Con esto no se muestra la ventana de la aplicación que ejecutes.

Reply

cuando ejecuto el proyecto funciona bien , pero si solo ejecuto el .exe no funciona.

Reply

Hola, en el código de más arriba a aparece en False, pero debes cambiarlo a True

procStartInfo.CreateNoWindow = true;

Reply

Muchas gracias. Me ha servido de mucho :)

Reply

Hola muy buen aporte, ahora necesito una mano sobre eso, yo ejecuto un archivo .bat desde c#.. el cual me ejecuta un comando de una aplicación (gpg para encriptación) el mismo al ejecutar me pide ingreso de texto (contraseña de encriptación) con una ventana emergente... si o si necesitaría poder escribir en esa ventana emergente sin que se interactue con el usuario, es decir que lo haga todo por codigo... Aclaro de antemano encontré una solución
que es enviarlo junto con el comando en el .bat lo que quiero escribir de la siguiente manera a modo de ejemplo :
echo "contraseña" | gpg -o archivosalida.txt archivoAdesencriptar.gpg

al ejecutar por primera vez la parte 'echo "contraseña" ' no me toma, me lanza dicha ventana emergente de la aplicación, pero al realizarlo por segunda vez si funciona... quisera saber como evitar ese ingreso por primera vez... sería esa la cuestion..

Muchas gracias desde ya
Saludos

Reply

Publicar un comentario en la entrada