www wixsite txt registros registro que continuación configurar configuración añade aparece agregar wix windows-installer custom-action

wixsite - ¿Cómo agregar una acción personalizada de WiX que solo ocurre en la desinstalación(a través de MSI)?



registro a wix (5)

El mayor problema con una secuencia de comandos por lotes es deshacerse de la restauración cuando el usuario hace clic en cancelar (o algo va 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 esa forma, Windows Installer 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, agrega un elemento Condición con:

REMOVE ~= "ALL"

el ~ = dice comparar mayúsculas y minúsculas (aunque creo que ALL siempre es uppercaesd). Consulte la documentación de MSI SDK sobre Sintaxis de condiciones para obtener más información.

PD: Nunca ha habido 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 devolver el producto para obtener un reembolso.

Me gustaría modificar un instalador de 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 como para eliminar de forma recursiva una carpeta completa que tenga contenido creado después de la instalación.

Observé la pregunta similar sobre el desbordamiento de pila. Eliminé archivos al desinstalar WiX , pero me preguntaba si esto podría hacerse de forma más simple utilizando 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?


Hay múltiples problemas con la respuesta de yaluna , también los nombres de las propiedades distinguen entre mayúsculas y minúsculas, Installed es la ortografía correcta ( INSTALLED no funcionará). La tabla de arriba debería haber sido esta:

Además, suponiendo una reparación y desinstalación completa, los valores reales de las propiedades podrían ser:

La documentación de sintaxis de expresiones de WiX dice:

En estas expresiones, puede usar nombres de propiedad (recuerde que son sensibles a las mayúsculas y minúsculas).

Las propiedades están documentadas en la Guía del instalador de Windows (por ejemplo, Installed )

EDITAR: pequeña corrección en la primera tabla; evidentemente, "Desinstalar" también puede suceder con solo REMOVE siendo True .


Puedes hacer esto con una acción personalizada. Puede agregar una referencia a su acción personalizada en <InstallExecuteSequence> :

<InstallExecuteSequence> ... <Custom Action="FileCleaner" After=''InstallFinalize''> Installed AND NOT UPGRADINGPRODUCTCODE</Custom>

Luego también deberá definir su Acción en <Product> :

<Product> ... <CustomAction Id=''FileCleaner'' BinaryKey=''FileCleanerEXE'' ExeCommand='''' Return=''asyncNoWait'' />

Donde FileCleanerEXE es un binario (en mi caso un pequeño programa de c ++ que realiza la acción personalizada) que también se define en <Product> :

<Product> ... <Binary Id="FileCleanerEXE" SourceFile="path/to/fileCleaner.exe" />

El verdadero truco para esto es la condición de Installed AND NOT UPGRADINGPRODUCTCODE en 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 cual si está borrando archivos probablemente no sea lo que quiere durante la actualización.

En una nota al margen: recomiendo pasar por la molestia de usar algo como el programa C ++ para hacer la acción, en lugar de un script por lotes debido a la potencia y el control que proporciona, y puedes evitar que la ventana "prompt cmd" destelle mientras tu instalador se ejecuta.


Utilicé Custom Action codificada por separado en C ++ DLL y usé la DLL para llamar a la función apropiada en Desinstalar usando esta sintaxis:

<CustomAction Id="Uninstall" BinaryKey="Dll_Name" DllEntry="Function_Name" Execute="deferred" />

Usando el bloque de código anterior, pude ejecutar cualquier función definida en C ++ DLL en la desinstalación. FYI, mi función de desinstalación tenía un código relacionado con la eliminación de los datos de usuario actuales y las entradas de registro.


EDITAR : Quizás mire la respuesta inmediatamente debajo.

Este tema ha sido un dolor de cabeza por mucho tiempo. Finalmente lo resolví. Hay algunas soluciones en línea, pero ninguna de ellas realmente funciona. Y, por supuesto, no hay documentación. Por lo tanto, en el cuadro a continuación hay varias propiedades que se sugieren usar y los valores que tienen para varios escenarios de instalación:

Entonces, en mi caso, quería una CA que se ejecutará solo en las desinstalaciones, no en las actualizaciones, ni en las reparaciones ni en las modificaciones. De acuerdo con la tabla anterior, tuve que usar

<Custom Action=''CA_ID'' Before=''other_CA_ID''> (NOT UPGRADINGPRODUCTCODE) AND (REMOVE="ALL")</Custom>

¡Y funcionó!