28

En un proyecto de instalación, los archivos ejecutables como ".exe, .dll, .js, .vbs" son aceptables, pero no hay forma de ejecutar un archivo .bat en una acción personalizada.¿Cómo ejecutar un archivo ".bat" durante la instalación?

La pregunta es cómo ejecutar los archivos *.bat durante la instalación?

+2

¿Ha probado con cmd.exe xxxx.bat como parámetro? –

+0

No. ¿Cómo hacer esto? – mammadalius

Respuesta

54

Bueno, después de mucha búsqueda y prueba y error, he resuelto esto. No estoy seguro de si esta es la mejor manera, pero funciona.

Aquí está el escenario: Tengo una aplicación que me gustaría implementar a través de un proyecto de instalación de Visual Studio. Además de mis archivos de aplicación, me gustaría crear un subdirectorio en el directorio de destino que contiene un archivo por lotes (.bat). Me gustaría que este archivo se ejecute al final del proceso de instalación.

Esto es lo que hace:

  1. Crear un proyecto de instalación y configure como lo haría normalmente, incluyendo el subdirectorio en el que se va a colocar el archivo por lotes (que sólo puede colocarlo en la carpeta de aplicación directa si no lo quieres en un subdirectorio).
  2. En la vista "Sistema de archivos" (haga clic con el botón derecho en el proyecto en Explorador de soluciones-> Ver-> Sistema de archivos), agregue el archivo por lotes que desea ejecutar y cmd.exe (C: \ Windows \ System32 \ cmd.exe)
  3. Abra el "acciones personalizadas" vista (Haga clic derecho en el proyecto en la solución Explorer de> Ver-> acciones personalizadas)
  4. Haga clic en "confirmar" y seleccione "Agregar acción personalizada"
  5. Navegue y seleccione cmd.exe.
  6. Abra el panel de propiedades para la acción personalizada recién creada.
  7. Eliminar/Confirmar desde la propiedad Argumentos.
  8. Ingrese: /c "[TARGETDIR]subdirectoryname\batchfile.bat" en la propiedad Argumentos, donde el subdirectorio debe reemplazarse por el nombre de su subdirectorio (si coloca el archivo por lotes en un subdirectorio como yo lo hice ... si no lo hizo, el valor debe ser /c "[TARGETDIR]batchfile.bat") y batchfile.bat debe ser el nombre del archivo de su lote.

Eso es todo. El archivo por lotes ahora se ejecutará una vez que se complete el resto del proceso de instalación.

He aquí un ejemplo en aras de la claridad:

Mi archivo por lotes: blah.bat
Mi subdirectorio: midirectorio

El valor de los argumentos para mi acción de orientación personalizada cmd. exe sería entonces

/c "[TARGETDIR]mydir\blah.bat"

esperanza de que hel ps alguien!

+6

Como una adición, he encontrado que ejecuta el cmd.exe envasados ​​(en contraposición a cmd.exe en el directorio System32) convierte todos los mensajes de error de una declaración informativa a cosas como "El sistema no puede encontrar el texto del mensaje para el mensaje número 0x8" . Para evitar esto, puede (si se sabe con certeza que existirá cmd.exe en System32 en el equipo de destino) utiliza '/ c cmd.exe/c "TARGETDIR] subdirectoryname \ batchfile.bat"'. Esto provocará que cmd.exe empaquetado invoque el cmd.exe nativo en la computadora de destino, lo que dará los mensajes de error correctos. –

+1

Advertencia: ¡este método no funciona si la configuración se crea en Windows 10 y se ejecuta bajo Windows 7! – Lumo

+0

@Lumo: solo para obtener información; la opción con el trabajo 'vbs' es independiente del SO. – Stefan

0

Si está intentando ejecutar un archivo por lotes que tenga rutas relativas durante el proceso de instalación, eso no será seguro. Esto se debe a que el archivo por lotes tendrá en cuenta el directorio donde se está ejecutando el instalador y no dónde se instalaron los archivos. Utilice constructores de instalador que copien archivos por lotes en el directorio temporal.

4
  1. Consulte este artículo (el artículo está en desuso), aunque está en VB.NET también se aplica a C#. La parte más importante es (traducida a C#) crear una nueva Biblioteca de clases y agregar una nueva Clase de instalador con el siguiente contenido: como se indica en el artículo, puede crear una nueva acción personalizada con una referencia a su proyecto recién creado.

    override void Commit(IDictionary savedState) 
    { 
        base.Commit(savedState); 
        System.Diagnostics.Process.Start("myApp.bat","your bat arguments"); 
    } 
    
  2. Ahora estamos agregando archivos por lotes a su proyecto de instalador. Cree un proyecto de instalación y configúrelo como lo haría normalmente, incluido el subdirectorio en el que colocará su archivo por lotes (puede simplemente colocarlo en la carpeta de aplicaciones directamente si no lo desea en un subdirectorio).

  3. En la vista "Sistema de archivos" (haga clic derecho en el proyecto en el Explorador de soluciones-> Ver-> Sistema de archivos), agregue el archivo de proceso por lotes que desea ejecutar.

  4. Construir el proyecto de instalación.

4

Otra forma de lograr el mismo resultado es colocar un archivo .vbs en acciones personalizadas que ejecute el archivo .bat correspondiente. El siguiente código es el "RunRegisterComponents.vbs" que puse en la carpeta de la aplicación de configuración. Por supuesto, puse [TARGETDIR] como parámetro .vbs en la ventana de propiedades de Visual Studio.

dim WshShell 
Set WshShell = CreateObject("WScript.Shell") 

' Read the "CustomActionData" property holding the install directory. 
dim programDir 
programDir= property("CustomActionData") 

' Make the batch full file name and parameter 
commandString = chr(34) & programDir & "RegisterComponents.bat" & chr(34) & " " & chr(34) & 
programDir& chr(34) 

' Set the current directory 
WshShell.CurrentDirectory = programDir 

' Run batch. 
ret = WshShell.Run (commandString, 0, 0) 

Eso es como me puse mis acciones personalizadas:

enter image description here

espero que esto le puede ayudar!

+0

Sigo pensando que esta es la mejor opción ya que no depende de 'cmd.exe'. – Stefan

+0

Esta poniendo 'WshShell.CurrentDirectory' al directorio de instalación (' [TARGETDIR] '), no es redundante para colocar 'programDir' en el' 'commandString' antes RegisterComponents.bat'? – Wolf

Cuestiones relacionadas