batch-file visual-studio-2008 installation setup-project custom-action

batch file - ¿Cómo ejecutar un archivo ".bat" durante la instalación?



batch-file visual-studio-2008 (4)

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.

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


  1. Consulte este artículo (el artículo está en desuso), a pesar de que 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 con el botón derecho en el proyecto en Explorador de soluciones-> Ver-> Sistema de archivos), agregue el archivo por lotes que desea ejecutar.

  4. Construye el proyecto de instalador.


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 haces:

  1. 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).
  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 la vista "Acciones personalizadas" (haga clic derecho en el proyecto en el Explorador de soluciones-> Ver-> Acciones personalizadas)
  4. Haga clic derecho en "Commit" y elija "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 Arguments, donde subdirectoryname debe reemplazarse por el nombre de su subdirectorio (si coloca el archivo por lotes en un subdirectorio como lo hice ... si no lo hizo) t, el valor debe ser /c "[TARGETDIR]batchfile.bat" ) y batchfile.bat debe ser el nombre de archivo de su archivo por lotes.

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

Aquí hay un ejemplo por el bien de la claridad:

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

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

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

Espero que ayude a alguien!


Otra forma de alcanzar el mismo resultado es colocar un archivo .vbs en acciones personalizadas que ejecute el archivo correspondiente .bat. 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)

Así es como configuré mis acciones personalizadas:

¡Espero que esto pueda ayudarte!


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.