Die Deinstallation eines Empirum Paketes sollte komplett lokal, ohne weiteren Zugriff auf die Installationsquellen, möglich sein. Die Zuweisung und Installation einer höheren Version mit dem Setup.inf Standardwert AskUninstallOld=1 setzt das schon fast voraus. Von Haus aus bringen die meisten Installer bereits ihre Deinstallationsroutine, in Form einer uninstall.exe im jeweiligen Programmverzeichnis, mit. Warum jetzt dieser Beitrag?
Unattended Uninstallation Dialog
Wenn Du beim Nutzen des Package Wizards zum Erstellen einer „Unattended“ sprich „Silent“ Installation einer EXE an den Dialog zur Deinstallation kommst, kannst Du das „Basis Verzeichnis“ nicht anpassen. In das Eingabefeld für das Deinstallationsprogramm kannst Du den Aufruf „C:\Program Files (x86)\My Program\unins000.exe“ eintragen und den Assistenten erfolgreich beenden.
Deinstallation schlägt fehl
Die Tests zur Deinstallation des Programms im Rahmen der Paketierung schlagen fehl. Warum?
Fehlersuche / Behebung
Um herauszufinden, warum der Fehler auftritt, müssen wir uns die Abfolge der Befehle zur Deinstallation der Software in unserem erstellten Paket ansehen. Ein Blick in die Sektion [Set:Deinstallation] der Setup.inf, die für die Deinstallation zuständig ist, bringt den Fehler schnell zum Vorschein. Hier wird versucht, den folgenden Befehl auszuführen:
-Call "%Src%\C:\Program Files (x86)\My Program\unins000.exe" /S
Der Teil „%SRC%\C:\…“ sieht nicht nur seltsam aus, sondern kann auch nicht funktionieren. Angepasst, sollte der Aufruf wie folgt ausschauen:
-Call "C:\Program Files (x86)\My Program\unins000.exe" /S
oder besser noch
-Call "%ProgramFilesDirx86%\My Program\unins000.exe" /S
Mit diesen Anpassungen sollte die Deinstallation nun erfolgreich durchgeführt werden.
Anpassen der Vorlage
Damit die Anpassung nicht immer wieder im erstellten Paket vorgenommen werden muss, passt man die Vorlage „Unattended.inf“ (Empirum\Configurator\Packages\Matrix42\Packaging Center\<Version>\Templates) an. Dazu entfernt man aus der nachfolgenden Zeile:
-Call "%Src%\{UnattDeInst}" {UnattDeInstPar}
das %SRC%\ und macht daraus:
-Call "{UnattDeInst}" {UnattDeInstPar}
Tipp:
Einfacher ist es beim Aufruf der Deinstallionssektion sich die aktuellen Sourcen lokal zu kopieren.
Dazu zippe ich die Sourcen und lasse das so laufen – hier am Beispiel Office 365.
Die Sourcen werden dann hier immer mit übertragen. Die Deininstallation erfolgt dann lokal, da die Variable %SRC% bedient wird.
Beispiel:
[Installer]
1:..\..\..\..\User\Setup.exe, %CommonSetupDir%, OPTIONAL USEFILENAME DIRECTORY NOSIZEWARNING SETUP, 0
1:..\..\..\..\User\SetupDeu.chm, %CommonSetupDir%, OPTIONAL USEFILENAME DIRECTORY NOSIZEWARNING SETUP, 0
1:..\..\..\..\User\SetupEnu.chm, %CommonSetupDir%, OPTIONAL USEFILENAME DIRECTORY NOSIZEWARNING SETUP, 0
1:%SetupInfDir%\Setup.inf, , NORMAL, 0
1:%Temp%\Setup64.exe, %CommonSetupDir%\Setup.exe, OPTIONAL NOSIZEWARNING SETUP ALWAYS WINDOWS64, 0
; 1:%SetupInfDir%\Logo.bmp, , NORMAL, 0
1:%SetupInfDir%\Setup.ico, , NORMAL, 0
1:%SetupInfDir%\ErrorCode2Text.ini, , NORMAL, 0
; 1:Source\Setup.exe, %APP%\ , NORMAL USEFILENAME DIRECTORY, 0
; 1:Source\configuration.xml, , ALWAYS, 0
; 1Source\configuration_ALL.xml, , ALWAYS, 0
; 1Source\remove.xml, , ALWAYS, 0
1:7z.dll, %APP%\ , NORMAL USEFILENAME DIRECTORY, 0
1:7z.exe, %APP%\ , NORMAL USEFILENAME DIRECTORY, 0
1:Source.7z, %APP%\ , NORMAL USEFILENAME DIRECTORY, 0
[Set:Sourcen]
Callhidden „%SRC%\7z.exe“ x „%SRC%\Source.7z“ -o“%APP%\“ -r -aoa
1:%APP%\Source\Setup.exe, %APP%\ , NORMAL USEFILENAME DIRECTORY, 0
1:%APP%\Source\configuration.xml, , ALWAYS, 0
1:%APP%\Source\configuration_ALL.xml, , ALWAYS, 0
1:%APP%\Source\remove.xml, , ALWAYS, 0
Hallo,
ich versuche jeweils die lokal vorhandenen EXEcutables zu nutzen, um die Deinstallation durchzuführen. Deinen beschriebenen Wege nutze ich dann, wenn die Deinstallation tatsächlich nur mit der Setup-Routine funktioniert.
Du meinst im ersten Satz bestimmt – Aufruf der Installationssektion, oder?
Danke für Dein Mitwirken.
Grüße
Jochen
Hallo Jochen.
Das ist ja nur ein Beispiel, wie es gehen könnte. Viele Apps lassen sich einfach nicht mit dem lokalem Installer deininstallieren, da die Installersourcen nicht mehr „auffindbar“ sind etc, etc.
Bei der De-Installation werden in der Standardpaktierung keine Sourcen übertragen, da Setup.exe versucht, die lokale „Setup.inf“ zu benutzen. Das läuft in der Regel oft schief, wenn die Sourcen nach 90 Tagen gelöscht werden oder keine Berechtigung auf das %APP% Verzeichnis vorhanden ist.
Somit behandle ich die Deinistallation, wie eine Neuinstallation. Natürlich mit „-“ als Präfix.
Danke für den Hinweis.
Gruß
Mike