Je voudrais modifier un programme d'installation MSI (créé via WiX ) pour supprimer un répertoire entier lors de la désinstallation.
Je comprends les options RemoveFile
et RemoveFolder
de WiX, mais celles-ci ne sont pas assez robustes pour supprimer de manière récursive un dossier entier dont le contenu a été créé après l'installation.
J'ai remarqué la question similaire de Stack Overflow Suppression de fichiers lors de la désinstallation de WiX , mais je me demandais si cela pouvait être fait plus simplement en utilisant un appel à un script batch pour supprimer le dossier.
C'est la première fois que j'utilise WiX et je suis toujours en train de maîtriser les actions personnalisées . Quel serait un exemple de base d'action personnalisée qui exécutera un script batch lors de la désinstallation?
la source
Il y a plusieurs problèmes avec la réponse de yaluna , aussi les noms de propriété sont sensibles à la casse,
Installed
est l'orthographe correcte (INSTALLED
ne fonctionnera pas). Le tableau ci-dessus aurait dû être le suivant:En supposant également une réparation et une désinstallation complètes, les valeurs réelles des propriétés pourraient être:
La documentation de la syntaxe d'expression WiX dit:
Les propriétés sont documentées dans le guide Windows Installer (par exemple installé )
EDIT: Petite correction au premier tableau; évidemment "Désinstaller" peut également se produire avec le simple fait d'
REMOVE
êtreTrue
.la source
Vous pouvez le faire avec une action personnalisée. Vous pouvez ajouter une référence à votre action personnalisée sous
<InstallExecuteSequence>
:Ensuite, vous devrez également définir votre Action sous
<Product>
:Où FileCleanerEXE est un binaire (dans mon cas, un petit programme c ++ qui fait l'action personnalisée) qui est également défini sous
<Product>
:La vraie astuce pour cela est la
Installed AND NOT UPGRADINGPRODUCTCODE
condition de l'action personnalisée, sans que votre action soit exécutée à chaque mise à niveau (puisqu'une mise à niveau est en réalité une désinstallation puis une réinstallation). Ce qui, si vous supprimez des fichiers, n'est probablement pas souhaité lors de la mise à niveau.Sur une note latérale: je recommande de passer par la peine d'utiliser quelque chose comme le programme C ++ pour faire l'action, au lieu d'un script batch en raison de la puissance et du contrôle qu'il fournit - et vous pouvez empêcher la fenêtre "cmd prompt" de clignoter pendant votre programme d'installation s'exécute.
la source
CustomAction
sera exécuté "After = 'InstallFinalize'". À ce stade, tous les fichiers sont supprimés du dossier d'installation. Aussi le fileCleaner.exe. Vous ne pouvez donc pas l'exécuter via une CustomAction. Cette réponse est tout simplement fausse. Je m'interroge sur les 42 votes positifs!Le plus gros problème avec un script batch est la gestion de la restauration lorsque l'utilisateur clique sur Annuler (ou quelque chose ne va pas pendant votre installation). La manière correcte de gérer ce scénario consiste à créer une CustomAction qui ajoute des lignes temporaires à la table RemoveFiles. De cette façon, Windows Installer gère les cas de restauration pour vous. C'est incroyablement plus simple quand vous voyez la solution.
Quoi qu'il en soit, pour qu'une action ne s'exécute que lors de la désinstallation, ajoutez un élément Condition avec:
le ~ = dit comparer insensible à la casse (même si je pense que ALL est toujours uppercaesd). Consultez la documentation du SDK MSI sur la syntaxe des conditions pour plus d'informations.
PS: Il n'y a jamais eu de cas où je me suis assis et j'ai pensé: "Oh, le fichier batch serait une bonne solution dans un package d'installation." En fait, trouver un package d'installation contenant un fichier de commandes ne ferait que m'encourager à retourner le produit pour un remboursement.
la source
Voici un ensemble de propriétés que j'ai rendues plus intuitives à utiliser que les éléments intégrés. Les conditions sont basées sur la table de vérité fournie ci-dessus par ahmd0.
Voici quelques exemples d'utilisation:
Problèmes:
la source
J'ai utilisé l'action personnalisée codée séparément dans la DLL C ++ et utilisé la DLL pour appeler la fonction appropriée lors de la désinstallation en utilisant cette syntaxe:
En utilisant le bloc de code ci-dessus, j'ai pu exécuter n'importe quelle fonction définie dans la DLL C ++ lors de la désinstallation. Pour info, ma fonction de désinstallation avait un code concernant la suppression des données utilisateur actuelles et des entrées de registre.
la source