none
Ejecutar archivo bat o cmd desde C# RRS feed

  • Pregunta

  • Hola:

    ¿Cómo se ejecuta un archivo bat o cmd desde C# en modo consola?

    He estado probando esto.

    using System.Diagnostics;
    
    namespace Bat_desde_CS_Consola_01
    {
        class Program
        {
            static void Main(string[] args)
            {
                Process p = new Process();
                p.StartInfo.FileName = "C:\\Users\\Usuario\\Desktop\\ejemplo.bat";
                p.Start();
            }
        }
    }

    Pero me da el resultado esto otro.

    No se pudo encontrar C:\Users\Usuario\Documents\Visual Studio 2017\Projects\Bat_desde_CS_Consola_01\Bat_desde_CS_Consola_01\bin\Debug\aaa.exe
    Presione una tecla para continuar . . .

    Cuando lo haga, no debe mostrar la ventana. Esto si lo indica aquí.

    https://es.stackoverflow.com/questions/115789/ejecutar-un-bat-desde-c-sin-que-se-muestre-la-ventana-de-cmd

    Saludos.


    http://electronica-pic.blogspot.com


    • Editado Metaconta lunes, 2 de abril de 2018 21:08
    lunes, 2 de abril de 2018 20:48

Respuestas

  • Buenas Metaconta,

    No entiendo tu duda, he entrado al link que pones e indican como lanzar el proceso:

     ProcessStartInfo psi = new ProcessStartInfo();
     psi.UseShellExecute = false;  
     psi.Arguments = "-jar -XX:+UseConcMarkSweepGC -Xmx1024M -Xms1024M START.jar";
     psi.CreateNoWindow = true;
     psi.WindowStyle = ProcessWindowStyle.Hidden;
     psi.FileName = "jre8\\bin\\javaw.exe";
     Process.Start(psi);

    en tu caso concreto, seria:

     ProcessStartInfo psi = new ProcessStartInfo();
     psi.UseShellExecute = false;  
     psi.CreateNoWindow = true;
     psi.WindowStyle = ProcessWindowStyle.Hidden;
     psi.FileName = "RUTA A TU .BAT";
     Process.Start(psi);

    Atte


    No olvides votar mi comentario si te ha ayudado y marcarlo como respuesta si ha sido la solución, con eso ayudas a mejorar mi reputación en la comunidad y a identificar la respuesta a la gente que tenga el mismo problema.

    Para obtener una respuesta lo más rápida y concisa posible, te recomiendo:

    • Marcado como respuesta Metaconta lunes, 2 de abril de 2018 22:46
    lunes, 2 de abril de 2018 21:07

Todas las respuestas

  • Buenas Metaconta,

    No entiendo tu duda, he entrado al link que pones e indican como lanzar el proceso:

     ProcessStartInfo psi = new ProcessStartInfo();
     psi.UseShellExecute = false;  
     psi.Arguments = "-jar -XX:+UseConcMarkSweepGC -Xmx1024M -Xms1024M START.jar";
     psi.CreateNoWindow = true;
     psi.WindowStyle = ProcessWindowStyle.Hidden;
     psi.FileName = "jre8\\bin\\javaw.exe";
     Process.Start(psi);

    en tu caso concreto, seria:

     ProcessStartInfo psi = new ProcessStartInfo();
     psi.UseShellExecute = false;  
     psi.CreateNoWindow = true;
     psi.WindowStyle = ProcessWindowStyle.Hidden;
     psi.FileName = "RUTA A TU .BAT";
     Process.Start(psi);

    Atte


    No olvides votar mi comentario si te ha ayudado y marcarlo como respuesta si ha sido la solución, con eso ayudas a mejorar mi reputación en la comunidad y a identificar la respuesta a la gente que tenga el mismo problema.

    Para obtener una respuesta lo más rápida y concisa posible, te recomiendo:

    • Marcado como respuesta Metaconta lunes, 2 de abril de 2018 22:46
    lunes, 2 de abril de 2018 21:07
  • Hola:

    Funciona. Todo invisible.

    Ya puedo borrar con el cmd el propio archivo C#.

    /* C# llama a un archivo bat o cmd y lo ejecuta.
     Tampoco muestra ventana del ms-dos del bat.
    
     La aplicación de C#, tampoco muestra ventana. 
     Propiedades -> Aplicación -> Tipo de salida: -> Aplicación Windows.
    
     C# ejecuta un archivo bat o cmd. cmd borra el exe del C# y así mismo.
    
     Código archivo.cmd
    
    @echo off
    DEL /S Bat_desde_CS_Consola_01.exe
    DEL /S archivo.cmd
    EXIT
    
     */
    
    using System.ComponentModel;
    using System.Diagnostics;
    
    namespace Bat_desde_CS_Consola_01
    {
        class Program
        {
            static void Main(string[] args)
            {
                try
                {
                    ProcessStartInfo psi = new ProcessStartInfo();
                    psi.UseShellExecute = false;
                    psi.CreateNoWindow = true;
                    psi.WindowStyle = ProcessWindowStyle.Hidden;
                    //psi.FileName =  @"C:\Users\Meta\Desktop\ejemplo.bat";
                    psi.FileName = @"archivo.cmd";
                    Process.Start(psi);
                }
    
                catch (Win32Exception)
                {
                    // No mostrar nada.
                }
            }
        }
    }

    ¿Por qué no se puede borrar el propio ejecutable de C# así mismo y un archivito bat de los viejos tiempos si?

    Saludos.


    http://electronica-pic.blogspot.com


    • Editado Metaconta martes, 3 de abril de 2018 8:41
    lunes, 2 de abril de 2018 22:46
  • Bueno, es sorpresa para mí que funcione la solución que le dieron.  Pensaba que tenía un error porque si UseShellExecute es False, quiere decir que el FileName es un archivo ejecutable, o sea, un achivo en formato PE (Portable Executable).  Un archivo .bat en realidad corre con cmd.exe, así que yo hubiera pensado que FileName debía ser "cmd.exe" y que los argumentos serían el nombre del .bat.  Pero en fin, si funciona, funciona.

    ¿Por qué un exe no puede borrarse?  Bueno, por lo que explico en el párrafo anterior:  Un .BAT no es un ejecutable.  Es un archivo de texto que es interpretado por cmd.exe.  Si usted corre un archivo llamado miarch.bat y abre el explorador de tareas, no encontrará en ninguna parte un proceso llamado miarch.bat.  Si encontrará, sin embargo, uno llamado cmd.exe.

    Entonces la diferencia entre su ejecutable y un .BAT:  Su ejecutable de C# es realmente un ejecutable, y dicho archivo no puede borrarse mientras el ejecutable esté ejecutándose; un archivo .BAT es un simple archivo de texto que es leído por cmd.exe.  Después de leerse, puede borrarse.  La lectura la conserva cmd.exe en memoria.


    Jose R. MCP
    Code Samples

    martes, 3 de abril de 2018 3:22
    Moderador
  • Muy buena explicación webJose.

    Solo me falta que en C#, cree un archivo bat o cmd con sus instrucciones, luego lo ejecuta. Lo quiero probar y saber si no tiene problemas de tiempo y C# se trunque por llamarlo de alguna manera.

    1. C# crea bat.
    2. C# ejecuta bat.
    3. C# se cierra así mismo.
    4. Bat borra C#.
    5. Bat se borra así mismo.

    En cuanto donde dices que la lectura la conserva cmd.exe en memoria. 

    ¿Qué quieres decir con ello?

    ¿Los comandos del bat se queda en la memoria RAM a pesar de borrarse así mismo?

    Saludos.


    http://electronica-pic.blogspot.com


    • Editado Metaconta martes, 3 de abril de 2018 9:53
    martes, 3 de abril de 2018 8:32
  • Buenas:

    Dejo el código completo. Lo que hace es:

    1. Ejecutar C#.
    2. C# crea un archivo bat o cmd.
    3. C# ejecuta el bat.
    4. Bat tiene tiempo de retardo de 1 segundo.
    5. C# después de crear el archivo bat, se cierra así mismo o se acaba el programa.
    6. Después de pasar 1 segundo, borra el .exe y el bat .cmd así mismo.
    7. No hay ningún rastro de archivos.
    using System;
    using System.ComponentModel;
    using System.Diagnostics;
    using System.IO;
    
    namespace Bat_desde_CS_Consola_02
    {
        class Program
        {
            static void Main(string[] args)
            {
                try
                {
                    // Variables.
                    string strFileFullName = @"archivo.cmd"; // Nombre del archivo.
                    string ruta = Environment.GetFolderPath(Environment.SpecialFolder.Desktop); // Ruta.
                    string ficheroAGrabar = Path.Combine(ruta, strFileFullName); // Concatenar ruta.
    
                    // Muestra la ruta en pantalla.
                    Console.WriteLine(ruta); // C:\Users\Usuario\Desktop
    
                    // Si no existe el archivo.
                    if (!File.Exists(ficheroAGrabar))
                    {
                        // Crea el contenido al archivo de texto.
                        File.WriteAllText(ficheroAGrabar, @"@echo off
    TIMEOUT /T 1
    DEL /S Bat_desde_CS_Consola_02.exe
    DEL /S archivo.cmd
    EXIT");
                    }
    
                    else // Si existe...
                    {
                        // Codigo a ejecutar si existe...
                        Console.WriteLine("El archivo existe, así que no se sustituirá.");
                    }
    
                    // Ejecutar archivo.cmd.
                    ProcessStartInfo psi = new ProcessStartInfo();
                    psi.UseShellExecute = false;
                    psi.CreateNoWindow = true;
                    psi.WindowStyle = ProcessWindowStyle.Hidden;
                    psi.FileName = strFileFullName; // archivo.cmd.
                    Process.Start(psi);
    
                    // Cerrar aplicación C#.
                    Environment.Exit(-1);
                }
    
                catch (Win32Exception)
                {
                    // No mostrar nada.
                    // Cerrar aplicación C#.
                    Environment.Exit(-1);
                }
            }
        }
    }

    En el editor de registro, se queda el nombre y ruta del .exe ejecutado.

    Suele estar en esta dirección, al menos en Windows 10 de 64 bits.

    Equipo\HKEY_CLASSES_ROOT\Local Settings\Software\Microsoft\Windows\Shell\MuiCache

    Equipo\HKEY_CURRENT_USER\Software\Classes\Local Settings\Software\Microsoft\Windows\Shell\MuiCache

    Equipo\HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Compatibility Assistant\Store

    Equipo\HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\bam\UserSettings\S-1-5-21-1318602974-3718958170-1399798190-1001

    Equipo\HKEY_USERS\S-1-5-21-1318602974-3718958170-1399798190-1001\Software\Classes\Local Settings\Software\Microsoft\Windows\Shell\MuiCache

    Equipo\HKEY_USERS\S-1-5-21-1318602974-3718958170-1399798190-1001\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Compatibility Assistant\Store

    Equipo\HKEY_USERS\S-1-5-21-1318602974-3718958170-1399798190-1001_Classes\Local Settings\Software\Microsoft\Windows\Shell\MuiCache


    Debo aprender a localizar y borrar las rutas de los archivos entontrados, solo la ruta y nombre del ejecutale que estamos ejecutando.

    Saludos.


    http://electronica-pic.blogspot.com




    • Editado Metaconta martes, 3 de abril de 2018 20:26
    martes, 3 de abril de 2018 20:03
  • Buenas Metaconta

    De todos modos, ya que ejecutas un programa en C#, para que el bat? podrías meter el código de tu bat en tu programa y listo

    P.D: Aun me estoy riendo de "Kit" xD

    Atte


    No olvides votar mi comentario si te ha ayudado y marcarlo como respuesta si ha sido la solución, con eso ayudas a mejorar mi reputación en la comunidad y a identificar la respuesta a la gente que tenga el mismo problema.

    Para obtener una respuesta lo más rápida y concisa posible, te recomiendo:


    martes, 3 de abril de 2018 20:06
  • Buenas:

    Porque C# no es capaz de borrase así mismo. Con el archivo bat externo si lo puede hacer y así mismo también.

    En cuanto a lo de Kit, mucho recuerdos viejos, xdddd.


    http://electronica-pic.blogspot.com

    martes, 3 de abril de 2018 22:36