Me gustaría modificar un instalador MSI (creado a través de WiX ) para eliminar un directorio completo en la desinstalación.
Entiendo las opciones RemoveFile
y RemoveFolder
en WiX, pero estas no son lo suficientemente robustas para eliminar recursivamente una carpeta completa que tiene contenido creado después de la instalación.
Noté la pregunta similar de Stack Overflow Eliminar archivos al desinstalar WiX , pero me preguntaba si esto podría hacerse más simplemente usando una llamada a un script por lotes para eliminar la carpeta.
Esta es la primera vez que uso WiX, y todavía me estoy acostumbrando a las acciones personalizadas . ¿Cuál sería un ejemplo básico de una acción personalizada que ejecutará un script por lotes en la desinstalación?
fuente
Hay múltiples problemas con la respuesta de yaluna , también los nombres de propiedad distinguen entre mayúsculas y minúsculas,
Installed
es la ortografía correcta (INSTALLED
no funcionará). La tabla anterior debería haber sido esta:Suponiendo también que una reparación completa y desinstalar los valores reales de las propiedades podría ser:
La documentación de la sintaxis de expresión de WiX dice:
Las propiedades están documentadas en la Guía del instalador de Windows (por ejemplo, instalado )
EDITAR: pequeña corrección a la primera tabla; evidentemente, "Desinstalar" también puede ocurrir con solo
REMOVE
serTrue
.fuente
Puede hacer esto con una acción personalizada. Puede agregar una referencia a su acción personalizada en
<InstallExecuteSequence>
:Entonces también tendrás que definir tu acción en
<Product>
:Donde FileCleanerEXE es un binario (en mi caso, un pequeño programa c ++ que realiza la acción personalizada) que también se define en
<Product>
:El verdadero truco para esto es la
Installed AND NOT UPGRADINGPRODUCTCODE
condición de la Acción personalizada, sin que su acción se ejecute en cada actualización (ya que una actualización es realmente una desinstalación y luego reinstalar). Lo que si está eliminando archivos probablemente no sea lo que desea durante la actualización.En una nota al margen: recomiendo pasar por el problema de usar algo como el programa C ++ para realizar la acción, en lugar de un script por lotes debido a la potencia y el control que proporciona, y puede evitar que la ventana "cmd prompt" parpadee mientras su instalador se ejecuta.
fuente
CustomAction
se ejecutará "After = 'InstallFinalize'". En este punto, todos los archivos se eliminan de la carpeta Instalación. También el fileCleaner.exe. Por lo tanto, no puede ejecutarlo a través de CustomAction. Esta respuesta es simplemente incorrecta. Me pregunto sobre los 42 votos a favor.El mayor problema con un script por lotes es manejar la reversión cuando el usuario hace clic en cancelar (o algo sale mal durante la instalación). La forma correcta de manejar este escenario es crear una CustomAction que agregue filas temporales a la tabla RemoveFiles. De esta forma, el Instalador de Windows maneja los casos de reversión por usted. Es increíblemente más simple cuando ves la solución.
De todos modos, para que una acción solo se ejecute durante la desinstalación, agregue un elemento Condición con:
el ~ = dice comparar mayúsculas y minúsculas (aunque creo que TODO siempre está en mayúscula). Consulte la documentación del SDK de MSI sobre la sintaxis de condiciones para obtener más información.
PD: Nunca hubo un caso en el que me senté y pensé: "Oh, el archivo por lotes sería una buena solución en un paquete de instalación". En realidad, encontrar un paquete de instalación que tenga un archivo por lotes solo me animaría a devolver el producto para obtener un reembolso.
fuente
Aquí hay un conjunto de propiedades que hice que se siente más intuitivo de usar que las cosas integradas. Las condiciones se basan en la tabla de verdad proporcionada anteriormente por ahmd0.
Aquí hay algunos ejemplos de uso:
Cuestiones:
fuente
Utilicé Acción personalizada codificada por separado en DLL de C ++ y utilicé la DLL para llamar a la función apropiada al desinstalar usando esta sintaxis:
Usando el bloque de código anterior, pude ejecutar cualquier función definida en C ++ DLL en la desinstalación. Para su información, mi función de desinstalación tenía código con respecto a la eliminación de datos de usuarios actuales y entradas de registro.
fuente