So führen Sie benutzerdefinierte Aktionen nur bei der Installation aus (nicht bei der Deinstallation)

73

Ich bin mir sicher, dass das ziemlich einfach ist, aber ich hatte es irgendwie schwer damit. Ich habe eine benutzerdefinierte Aktion, die bei der Installation ein anderes Installationsprogramm (nicht MSI) ausführt. Leider ist mir aufgefallen, dass das Installationsprogramm auch bei der Deinstallation ausgeführt wird!

Ich habe die Optionen durchgesehen, aber ich kann nicht herausfinden, wie ich das stoppen kann. Wenn mir jemand helfen könnte, wäre ich unglaublich dankbar.

Wie stelle ich eine benutzerdefinierte Aktion so ein, dass sie nur während der Deinstallation ausgelöst wird? Jede Hilfe wird sehr geschätzt Jungs!

Zypern106
quelle
5
Als Referenz: Common MSI Conditions Cheat Sheet .
Stein Åsmul

Antworten:

168

Fügen Sie der Aktion eine Bedingung hinzu, damit sie nur während der Installation und nicht während der Deinstallation ausgelöst wird.

Aktion wird nur während der Installation ausgeführt

NOT Installed AND NOT PATCH

Die Aktion wird während der Installation und Reparatur ausgeführt

NOT REMOVE

Nur bei der Erstinstallation ausführen:

NOT Installed

Bei Erstinstallation ausführen oder wenn Reparatur ausgewählt ist.

NOT Installed OR MaintenanceMode="Modify"

Verwenden Sie die folgende Bedingung, um eine Aktion nur während der Deinstallation auszuführen:

REMOVE~="ALL"

So führen Sie eine Aktion nur während des Upgrades aus:

Installed AND NOT REMOVE
saschabeaumont
quelle
1
@Rasa was meinst du mit Neuinstallationsmodus? Im MSI-Sprachgebrauch gibt es so etwas nicht. Sie suchen wahrscheinlich nach "Reparieren" (NICHT ENTFERNEN). Wenn Sie die MSI-Ausgabe protokollieren, können Sie genau sehen, auf welche verschiedenen Werte unter den oben genannten Bedingungen eingestellt wird, und herausfinden, welche Ihrer Situation entsprechen würden.
Saschabeaumont
1
Was ist mit Ändern? Eine Aktion nur ausführen, wenn eine Funktion deinstalliert ist? Eine Aktion nur ausführen, wenn eine Funktion installiert wird? Eine Aktion nur ausführen, wenn eine Funktion repariert ist?
Didier A.
Vielen Dank, es hilft mir sehr. Ich wurde verrückt. NICHT ENTFERNEN hat mir geholfen
ertan2002
1
Zusätzlich zu dem Link, den ich zur Frage hinzugefügt habe, ist hier ein direkter Link zum PDF des Spickzettel. Keine Garantie, ich habe diese Bedingungen nicht selbst getestet, aber sie stammen von Installshield, daher sollten sie in Ordnung sein: Allgemeine MSI-Bedingungen .
Stein Åsmul
7

Eine kleine Korrektur:

Um eine Aktion nur während der Deinstallation auszuführen, verwenden Sie die folgende Bedingung: REMOVE="ALL"

Dies erscheint angemessener, da die Eigenschaft REMOVEdie zu deinstallierenden Funktionen enthält.
Wenn ich also eine Änderung vornehme, um eine Funktion zu entfernen, REMOVEist dies wahr und die Aktion, die nur bei der Deinstallation ausgeführt werden sollte, wird bei der Änderung ausgeführt.
Weitere Details hier auf MSDN

Jean-Francois Fortin
quelle
6

Ein Beispiel:

<InstallExecuteSequence>
..
    <Custom Action="QtExecIdOfCA" Before="InstallFinalize">NOT Installed</Custom>
..
</InstallExecuteSequence>

..
..
<CustomAction Id="QtExecIdOfCA" BinaryKey="WixCA" DllEntry="CAQuietExec" Execute="deferred" Return="ignore" Impersonate="no"/>

Beachten! Die Bedingung wird dem <Custom>Tag hinzugefügt und nicht die <CustomAction>, die mich verwirrt hat, da auf Benutzerdefiniert das Aktionsattribut folgt

kristoffer_o
quelle
1

Eine Bedingung für die benutzerdefinierte Aktion, wahrscheinlich mit einer passenden benutzerdefinierten Aktion für die Deinstallation. Ich bin mir nicht sicher, welche Tools Sie verwenden, aber wenn die sekundäre Installation an eine Komponente gebunden ist, würde ich diesen Komponentenstatus verwenden. Ein Zustand von = 3 bedeutet einen Zielzustand von installiert. Ein Zustand = 2 bedeutet einen Zielzustand der Abwesenheit. Beachten Sie, dass der Status nicht festgelegt wird, wenn keine Änderung vorgenommen wird.

Darren Clark
quelle