Comment ajouter un WiX action personnalisée qui se produit uniquement sur les désinstaller (via MSI)?
Je voudrais modifier un programme d'installation MSI (créé par WiX) pour supprimer un répertoire entier sur désinstaller.
Je comprends la RemoveFile
et RemoveFolder
options dans WiX, mais elles ne sont pas assez robustes pour supprimer de manière récursive un dossier complet qui a le contenu créé après l'installation.
J'ai remarqué la même Débordement de Pile question Suppression de fichiers lors de la désinstallation de WiX, mais je me demandais si cela pouvait être fait, plus simplement, à l'aide d'un appel à un script batch pour supprimer le dossier.
C'est ma première fois avec WiX, et je suis toujours à obtenir le coup de l' actions personnalisées. Ce serait un exemple de base d'une action personnalisée qui va exécuter un script batch sur désinstaller?
Vous devez vous connecter pour publier un commentaire.
MODIFIER: peut-être regarder la réponse tout de suite ci-dessous.
Ce sujet a été un casse-tête pour longtemps. J'ai enfin compris.
Il y a des solutions en ligne, mais aucun d'eux ne fonctionne vraiment. Et bien sûr, il n'y a pas de documentation.
Ainsi, dans le graphique ci-dessous il y a plusieurs propriétés qui sont proposées à utiliser et les valeurs qu'ils ont pour les différents scénarios d'installation:
Donc dans mon cas je voulais une autorité de certification qui ne fonctionnera que sur désinstalle - pas de mises à niveau, pas de réparations ou modifie. Selon le tableau ci-dessus, j'ai dû utiliser
Et cela a fonctionné!
(
et)
) semble nécessaire pour faire ce travail; juste un avertissement pour d'autres utilisateurs qui pensais aussi qu'ils n'ont pas besoin d'une portion de la copie de pâtes 🙂Il y a plusieurs problèmes avec yaluna réponse, aussi bien les noms sont sensibles à la casse,
Installed
est l'orthographe correcte (INSTALLED
ne fonctionnera pas).Le tableau ci-dessus devraient ai été:
Aussi en supposant une réparation complète & désinstaller les valeurs réelles des propriétés pourraient être:
La WiX La Syntaxe De L'Expression documentation dit:
Les propriétés sont documentées sur le programme d'installation de Windows Guide d'utilisation (par exemple,Installé)
EDIT: Petite correction à la première table; évidemment "Désinstaller" peut également se produire avec juste
REMOVE
êtreTrue
.Vous pouvez le faire avec une action personnalisée. Vous pouvez ajouter une refrence pour votre action personnalisée sous
<InstallExecuteSequence>
:Alors vous aurez également à définir votre Action en vertu de l'
<Product>
:Où FileCleanerEXE est un fichier binaire (dans mon cas un petit programme en c++ qui fait l'action personnalisée) qui est aussi définie en vertu de l'
<Product>
:Le vrai truc c'est le
Installed AND NOT UPGRADINGPRODUCTCODE
condition sur l'Action Personnalisée, avec que votre action va se faire à chaque mise à jour (depuis une mise à niveau est vraiment désinstaller, puis réinstaller). Qui, si vous la suppression de fichiers est probablement pas ce que vous voulez faire lors de la mise à niveau.Sur une note de côté: je recommande de passer par la difficulté de l'utilisation de quelque chose comme un programme C++ pour effectuer l'action, au lieu d'un script de commandes en raison de la puissance et le contrôle qu'elle fournit, et vous pouvez éviter le "invite de cmd" fenêtre de clignoter pendant que votre programme d'installation s'exécute.
CustomAction
sera exécuté "Après='InstallFinalize'". À ce stade, tous les fichiers sont supprimés à partir du dossier d'Installation. Aussi l'fileCleaner.exe. Si vous n'êtes pas en mesure de l'exécuter via un CustomAction. Cette réponse est tout simplement faux. Je me pose des questions sur les 42 upvotes!Le plus gros problème avec un script batch est de la manipulation de restauration lorsque l'utilisateur clique sur annuler (ou quelque chose se passe mal lors de votre installation). La bonne façon de gérer ce scénario est de créer un CustomAction qui ajoute temporaire des lignes à la RemoveFiles table. De cette façon, le programme d'installation de Windows gère la restauration des cas pour vous. Il est incroyablement plus simple quand vous voyez la solution.
De toute façon, pour avoir une action à exécuter uniquement lors de la désinstallation ajouter un élément de Condition avec:
l'~=, dit-comparer insensible à la casse (même si je pense que TOUT est toujours uppercaesd). Voir la MSI documentation du kit de développement sur les Conditions de Syntaxe pour plus d'informations.
PS: Il n'y a jamais eu un cas où je me suis assis et dit, "Oh, un fichier batch serait une bonne solution dans un package d'installation." En fait, la recherche d'un package d'installation qui a un fichier de commandes dans le il ne m'encourager à retourner le produit pour un remboursement.
Voici un ensemble de propriétés que j'ai faite qui se sentent plus intuitive à utiliser que de l'intégré dans le stuff. Les conditions sont basées à partir de la table de vérité fournies ci-dessus par ahmd0.
Voici quelques exemples d'utilisation:
Questions:
J'ai utilisé de l'Action Personnalisée séparément codé en C++ DLL et utilisé la DLL à l'appel de la fonction appropriée sur la Désinstallation à l'aide de cette syntaxe :
En utilisant le bloc de code ci-dessus, j'ai été en mesure d'exécuter n'importe quelle fonction définie en C++ DLL sur désinstaller.
Pour info, ma fonction de désinstallation a code en matière de Compensation des données utilisateur en cours et les entrées de registre.