Ich möchte ein MSI-Installationsprogramm (erstellt über WiX ) so ändern, dass bei der Deinstallation ein gesamtes Verzeichnis gelöscht wird.
Ich verstehe die RemoveFile
und RemoveFolder
Optionen in WiX, aber diese sind nicht robust genug, um einen gesamten Ordner rekursiv zu löschen, dessen Inhalt nach der Installation erstellt wurde.
Ich habe die ähnliche Frage zum Stapelüberlauf beim Entfernen von Dateien bei der Deinstallation von WiX bemerkt , aber ich habe mich gefragt, ob dies einfacher durch einen Aufruf eines Batch-Skripts zum Löschen des Ordners möglich ist.
Ich benutze WiX zum ersten Mal und habe immer noch den Dreh raus mit benutzerdefinierten Aktionen . Was wäre ein grundlegendes Beispiel für eine benutzerdefinierte Aktion, bei der bei der Deinstallation ein Batch-Skript ausgeführt wird?
quelle
Es gibt mehrere Probleme mit der Antwort von yaluna , auch bei Eigenschaftsnamen wird zwischen Groß- und Kleinschreibung unterschieden, es
Installed
wird die richtige Schreibweise angegeben (INSTALLED
funktioniert nicht). Die obige Tabelle hätte folgende sein sollen:Unter der Annahme einer vollständigen Reparatur und Deinstallation können die tatsächlichen Werte der Eigenschaften auch folgende sein:
In der Dokumentation zur WiX Expression Syntax heißt es:
Die Eigenschaften sind im Windows Installer-Handbuch dokumentiert (z. B. Installiert) ).
EDIT: Kleine Korrektur der ersten Tabelle; Offensichtlich kann "Deinstallieren" auch nur mit
REMOVE
Sein geschehenTrue
.quelle
Sie können dies mit einer benutzerdefinierten Aktion tun. Sie können Ihrer benutzerdefinierten Aktion unter
<InstallExecuteSequence>
: eine Aktualisierung hinzufügen.Dann müssen Sie auch Ihre Aktion definieren unter
<Product>
:Wobei FileCleanerEXE eine Binärdatei ist (in meinem Fall ein kleines C ++ - Programm, das die benutzerdefinierte Aktion ausführt), die auch definiert ist unter
<Product>
:Der eigentliche Trick dabei ist die
Installed AND NOT UPGRADINGPRODUCTCODE
Bedingung für die benutzerdefinierte Aktion, ohne dass Ihre Aktion bei jedem Upgrade ausgeführt wird (da ein Upgrade wirklich eine Deinstallation und dann eine Neuinstallation ist). Was Sie beim Aktualisieren wahrscheinlich nicht möchten, wenn Sie Dateien löschen.Nebenbei bemerkt: Ich empfehle, sich die Mühe zu machen, etwas wie ein C ++ - Programm zu verwenden, um die Aktion auszuführen, anstelle eines Batch-Skripts, da es über die Leistung und Kontrolle verfügt - und Sie können verhindern, dass das Fenster "cmd prompt" währenddessen blinkt Ihr Installationsprogramm wird ausgeführt.
quelle
CustomAction
wird "After = 'InstallFinalize'" ausgeführt. Zu diesem Zeitpunkt werden alle Dateien aus dem Installationsordner entfernt. Auch die fileCleaner.exe. Sie können es also nicht über eine CustomAction ausführen. Diese Antwort ist einfach falsch. Ich wundere mich über die 42 Upvotes!Das größte Problem bei einem Batch-Skript ist die Behandlung des Rollbacks, wenn der Benutzer auf Abbrechen klickt (oder während der Installation ein Fehler auftritt). Die richtige Methode zur Behandlung dieses Szenarios besteht darin, eine CustomAction zu erstellen, die der RemoveFiles-Tabelle temporäre Zeilen hinzufügt. Auf diese Weise behandelt der Windows Installer die Rollback-Fälle für Sie. Es ist wahnsinnig einfacher, wenn Sie die Lösung sehen.
Damit eine Aktion nur während der Deinstallation ausgeführt wird, fügen Sie ein Bedingungselement hinzu mit:
Das ~ = sagt, dass Groß- und Kleinschreibung nicht berücksichtigt wird (obwohl ich denke, dass ALL immer Uppercaesd ist). Weitere Informationen finden Sie in der MSI SDK-Dokumentation zur BedingungssyntaxWeitere Informationen finden .
PS: Es gab noch nie einen Fall, in dem ich mich hinsetzte und dachte: "Oh, Batch-Datei wäre eine gute Lösung in einem Installationspaket." Wenn ich ein Installationspaket mit einer Batch-Datei finde, kann ich das Produkt nur gegen eine Rückerstattung zurücksenden.
quelle
Hier ist eine Reihe von Eigenschaften, die ich gemacht habe und die sich intuitiver anfühlen als die eingebauten. Die Bedingungen basieren auf der oben von ahmd0 angegebenen Wahrheitstabelle.
Hier einige Beispiele für die Verwendung:
Probleme:
quelle
Ich habe Custom Action verwendet, die separat in der C ++ - DLL codiert ist, und die DLL verwendet, um die entsprechende Funktion zum Deinstallieren mit dieser Syntax aufzurufen:
Mit dem obigen Codeblock konnte ich bei der Deinstallation jede in der C ++ - DLL definierte Funktion ausführen. Zu Ihrer Information, meine Deinstallationsfunktion hatte Code zum Löschen aktueller Benutzerdaten und Registrierungseinträge.
quelle