184 Stimmen

Wie kann ich eine benutzerdefinierte WiX-Aktion hinzufügen, die nur bei der Deinstallation (über MSI) ausgeführt wird?

Ich möchte ein MSI-Installationsprogramm ändern (erstellt durch WiX ), um ein ganzes Verzeichnis bei der Deinstallation zu löschen.

Ich verstehe die RemoveFile y RemoveFolder Optionen in WiX, aber diese sind nicht robust genug, um einen ganzen Ordner, dessen Inhalt nach der Installation erstellt wurde, rekursiv zu löschen.

Ich habe eine ähnliche Frage bei Stack Overflow gefunden Entfernen von Dateien bei der Deinstallation von WiX aber ich frage mich, ob dies nicht einfacher mit einem Aufruf eines Batch-Skripts zum Löschen des Ordners geschehen könnte.

Ich verwende WiX zum ersten Mal und bin noch dabei, den Dreh raus zu haben. benutzerdefinierte Aktionen . Was wäre ein einfaches Beispiel für eine benutzerdefinierte Aktion, die ein Batch-Skript bei der Deinstallation ausführt?

207voto

EDITAR : Vielleicht sehen Sie sich die Antwort an derzeit unmittelbar unter .


Dieses Thema bereitet uns schon seit langem Kopfzerbrechen. Endlich habe ich es herausgefunden. Es gibt einige Lösungen im Internet, aber keine von ihnen funktioniert wirklich. Und natürlich gibt es keine Dokumentation. In der nachstehenden Tabelle sind mehrere Eigenschaften aufgeführt, deren Verwendung vorgeschlagen wird, und die Werte, die sie für verschiedene Installationsszenarien haben:

alt text

In meinem Fall wollte ich also eine CA, die nur bei Deinstallationen ausgeführt wird - nicht bei Upgrades, Reparaturen oder Änderungen. Gemäß der obigen Tabelle musste ich Folgendes verwenden

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

Und es hat funktioniert!

171voto

ahmd0 Punkte 15618

Es gibt zahlreiche Probleme mit yalunas Antwort Auch bei Eigenschaftsnamen wird zwischen Groß- und Kleinschreibung unterschieden, Installed ist die korrekte Schreibweise ( INSTALLED w Die Tabelle oben hätte so lauten sollen:

enter image description here

Auch bei einer vollständigen Reparatur und Deinstallation könnten die tatsächlichen Werte der Eigenschaften sein:

enter image description here

En WiX-Ausdruckssyntax sagt die Dokumentation:

In diesen Ausdrücken können Sie Eigenschaftsnamen verwenden (beachten Sie dabei die Groß- und Kleinschreibung).

Die Eigenschaften sind im Windows Installer Guide dokumentiert (z.B. Installiert )

EDIT: Kleine Korrektur der ersten Tabelle; offensichtlich kann "Deinstallieren" auch nur mit REMOVE unter True .

54voto

csexton Punkte 22829

Sie können dies mit einer benutzerdefinierten Aktion tun. Sie können einen Verweis auf Ihre benutzerdefinierte Aktion hinzufügen unter <InstallExecuteSequence> :

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

Dann müssen Sie auch Ihre Aktion unter <Product> :

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

FileCleanerEXE ist eine Binärdatei (in meinem Fall ein kleines C++-Programm, das die benutzerdefinierte Aktion ausführt), die ebenfalls unter <Product> :

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

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 eigentlich eine Deinstallation mit anschließender Neuinstallation ist). Wenn Sie Dateien löschen, ist das wahrscheinlich nicht erwünscht, wenn Sie ein Upgrade durchführen.

Eine Randbemerkung: Ich empfehle, sich die Mühe zu machen, die Aktion mit einem C++-Programm anstelle eines Batch-Skripts auszuführen, da es mehr Macht und Kontrolle bietet - und Sie können verhindern, dass das Fenster "Eingabeaufforderung" blinkt, während Ihr Installationsprogramm läuft.

42voto

Rob Mensching Punkte 31828

Das größte Problem bei einem Batch-Skript ist die Handhabung des Rollbacks, wenn der Benutzer auf Abbrechen klickt (oder bei der Installation etwas schief geht). Der richtige Weg, um dieses Szenario zu handhaben, besteht darin, eine CustomAction zu erstellen, die temporäre Zeilen zur RemoveFiles-Tabelle hinzufügt. Auf diese Weise übernimmt der Windows Installer die Rollback-Fälle für Sie. Es ist wahnsinnig einfach, wenn Sie die Lösung sehen.

Wie auch immer, um eine Aktion nur während der Deinstallation ausführen zu lassen, fügen Sie ein Bedingungselement mit hinzu:

REMOVE ~= "ALL"

die ~= besagt, dass bei Vergleichen die Groß-/Kleinschreibung keine Rolle spielt (auch wenn ich glaube, dass ALL immer in Großbuchstaben geschrieben wird). Siehe die MSI SDK-Dokumentation über Conditions Syntax für weitere Informationen.

PS: Es gab noch nie einen Fall, in dem ich mich hingesetzt und gedacht habe: "Oh, eine Batch-Datei wäre eine gute Lösung in einem Installationspaket." Wenn ich ein Installationspaket finde, das eine Batch-Datei enthält, würde mich das nur dazu bewegen, das Produkt zurückzugeben und den Kaufpreis zu erstatten.

18voto

Bill Tarbell Punkte 4498

Hier ist ein Satz von Eigenschaften, die ich gemacht habe, die sich intuitiver anfühlen als die eingebauten Sachen. Die Bedingungen sind aus der Wahrheitstabelle oben von ahmd0 geliefert basiert.

<!-- truth table for installer varables (install vs uninstall vs repair vs upgrade) https://stackoverflow.com/a/17608049/1721136 -->
 <SetProperty Id="_INSTALL"   After="FindRelatedProducts" Value="1"><![CDATA[Installed="" AND PREVIOUSVERSIONSINSTALLED=""]]></SetProperty>
 <SetProperty Id="_UNINSTALL" After="FindRelatedProducts" Value="1"><![CDATA[PREVIOUSVERSIONSINSTALLED="" AND REMOVE="ALL"]]></SetProperty>
 <SetProperty Id="_CHANGE"    After="FindRelatedProducts" Value="1"><![CDATA[Installed<>"" AND REINSTALL="" AND PREVIOUSVERSIONSINSTALLED<>"" AND REMOVE=""]]></SetProperty>
 <SetProperty Id="_REPAIR"    After="FindRelatedProducts" Value="1"><![CDATA[REINSTALL<>""]]></SetProperty>
 <SetProperty Id="_UPGRADE"   After="FindRelatedProducts" Value="1"><![CDATA[PREVIOUSVERSIONSINSTALLED<>"" ]]></SetProperty>

Hier sind einige Anwendungsbeispiele:

  <Custom Action="CaptureExistingLocalSettingsValues" After="InstallInitialize">NOT _UNINSTALL</Custom>
  <Custom Action="GetConfigXmlToPersistFromCmdLineArgs" After="InstallInitialize">_INSTALL OR _UPGRADE</Custom>
  <Custom Action="ForgetProperties" Before="InstallFinalize">_UNINSTALL OR _UPGRADE</Custom>
  <Custom Action="SetInstallCustomConfigSettingsArgs" Before="InstallCustomConfigSettings">NOT _UNINSTALL</Custom>
  <Custom Action="InstallCustomConfigSettings" Before="InstallFinalize">NOT _UNINSTALL</Custom>

Probleme:

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X