Comment append une action personnalisée WiX qui se produit uniquement lors de la désinstallation (via MSI)?

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 dans WiX, mais celles-ci ne sont pas assez robustes pour supprimer récursivement un dossier entier contenant du contenu créé après l’installation.

J’ai remarqué la question similaire Stack Overflow Enlever des 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 de commandes pour supprimer le dossier.

C’est la première fois que j’utilise WiX, et je suis toujours au fait des actions personnalisées . Quel serait un exemple de base d’une action personnalisée exécutant un script de commandes lors d’une désinstallation?

    EDIT : Peut-être regarder la réponse immédiatement ci-dessous.


    Ce sujet est un casse-tête depuis longtemps. J’ai finalement compris. Il existe certaines solutions en ligne, mais aucune ne fonctionne vraiment. Et bien sûr, il n’y a pas de documentation. Ainsi, dans le tableau ci-dessous, plusieurs propriétés sont suggérées et les valeurs qu’elles ont pour différents scénarios d’installation:

    texte alt

    Donc, dans mon cas, je voulais une CA qui ne fonctionnerait que lors de désinstallations – pas de mises à jour, pas de réparations ou de modifications. Selon le tableau ci-dessus, je devais utiliser

      (NOT UPGRADINGPRODUCTCODE) AND (REMOVE="ALL") 

    Et ça a marché!

    Il y a plusieurs problèmes avec la réponse de yaluna , les noms de propriétés sont sensibles à la casse, Installed est l’orthographe correcte ( INSTALLED ne fonctionnera pas). Le tableau ci-dessus aurait dû être ceci:

    entrer la description de l'image ici

    En supposant également une réparation complète et une désinstallation, les valeurs réelles des propriétés peuvent être:

    entrer la description de l'image ici

    La documentation sur la syntaxe d’expression WiX dit:

    Dans ces expressions, vous pouvez utiliser des noms de propriété (rappelez-vous qu’ils sont sensibles à la casse).

    Les propriétés sont documentées dans le guide Windows Installer (par exemple, installé ).

    EDIT: petite correction sur le premier tableau; De toute évidence, “Désinstaller” peut également se produire avec simplement REMOVE étant True .

    Vous pouvez le faire avec une action personnalisée. Vous pouvez append une référence à votre action personnalisée sous :

      ...  Installed AND NOT UPGRADINGPRODUCTCODE 

    Ensuite, vous devrez également définir votre action sous :

      ...  

    Où FileCleanerEXE est un fichier binary (dans mon cas un petit programme c ++ qui fait l’action personnalisée) qui est également défini sous :

      ...  

    La véritable difficulté réside dans la condition Installed AND NOT UPGRADINGPRODUCTCODE sur l’action personnalisée, sans que votre action soit exécutée à chaque mise à niveau (une mise à niveau étant en réalité une désinstallation, puis une réinstallation). Si vous supprimez des fichiers, vous ne voudrez probablement pas que vous souhaitiez les mettre à niveau.

    Remarque: je recommande de faire quelque chose comme le programme C ++ pour faire l’action, au lieu d’un script de traitement par lots, 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 installateur s’exécute

    Le plus gros problème avec un script de traitement par lots est la gestion de la restauration lorsque l’utilisateur clique sur Annuler (ou quelque chose ne va pas pendant l’installation). La manière correcte de gérer ce scénario consiste à créer un CustomAction qui ajoute des lignes temporaires à la table RemoveFiles. De cette manière, Windows Installer gère les cas d’annulation pour vous. C’est beaucoup plus simple lorsque vous voyez la solution.

    Quoi qu’il en soit, pour qu’une action ne soit exécutée que pendant la désinstallation, ajoutez un élément Condition avec:

     REMOVE ~= "ALL" 

    le ~ = dit insensible à la casse (même si je pense que TOUS 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 peut que m’encourager à retourner le produit pour un remboursement.

    J’ai utilisé l’action personnalisée séparément codée en DLL C ++ et utilisé la DLL pour appeler la fonction appropriée lors de la désinstallation utilisant cette syntaxe:

      

    En utilisant le bloc de code ci-dessus, j’ai pu exécuter toute fonction définie dans DLL C ++ lors de la désinstallation. Pour info, ma fonction de désinstallation avait du code concernant la suppression des données utilisateur et des entrées de registre actuelles.

    Voici un ensemble de propriétés que j’ai fait qui sont 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.

       "" AND REINSTALL="" AND UPGRADINGPRODUCTCODE="" AND REMOVE="ALL"]]> "" AND REINSTALL="" AND UPGRADINGPRODUCTCODE="" AND REMOVE=""]]> "" AND REINSTALL="ALL" AND UPGRADINGPRODUCTCODE="" AND REMOVE=""]]> "" AND REINSTALL="" AND UPGRADINGPRODUCTCODE<>"" AND REMOVE="ALL"]]> 

    Voici quelques exemples d’utilisation:

      NOT _UNINSTALL _INSTALL OR _UPGRADE _UNINSTALL OR _UPGRADE NOT _UNINSTALL NOT _UNINSTALL 

    Problèmes: