msi Rückkehrcodes im Inno-Setup

8

Ich möchte mehrere .msi-Dateien im unbeaufsichtigten Modus aufrufen und die gesamte Installation anhalten, falls eine fehlschlägt.

Ist es möglich, die Rückkehrcodes von msiexec.exe aus dem Abschnitt [run] aufzurufen?

Momentan kann ich nur Fehlermeldungen in der Windows-Ereignisanzeige sehen.

    
Rob Hunter 24.02.2009, 16:29
quelle

2 Antworten

5

Es gibt derzeit keine Möglichkeit, die erfolgreiche Ausführung von [Run] -Einträgen zu überprüfen. Der Code protokolliert nur den Prozessbeendigungscode und fährt mit dem nächsten Eintrag fort (er kann in der Inno Setup-Quelldatei überprüft werden Main.pas , die Funktion ist ProcessRunEntry () ab Zeile 3404 in der aktuellen Version 5.2.3).

Wenn Sie sicherstellen müssen, dass mehrere Ausführungen von msiexec erfolgreich waren, müssen Sie eine Zwischenebene codieren. Dies kann so einfach sein wie ein kleiner Stub, der in den [Run] -Einträgen ausgeführt wird und msiexec.exe mit den korrekten Parametern startet, auf den Abschluss des Prozesses wartet und den Rückkehrcode in eine Datei schreibt.

Eine weitere Möglichkeit, den Erfolg eines solchen Installationsschritts zu überprüfen, wäre, einen benutzerdefinierten Prozeduraufruf für jeden [Ausführen] -Eintrag hinzuzufügen, indem Sie den Parameter AfterInstall verwenden. In einer solchen Funktion könnten Sie beispielsweise prüfen, ob ein OCX-Control erfolgreich installiert wurde:

%Vor%

oder ob die Verzeichnisse und Registrierungseinträge für die Abhängigkeit alle vorhanden sind.

Jeder [Run] -Eintrag wird nur ausgeführt, wenn der optionale Check -Parameter den Wert true zurückgibt. Je nach Ihren Anforderungen können Sie entweder alle unbeaufsichtigten Installationen nacheinander starten und nach dem letzten Ausführen eine Skriptfunktion ausführen, um zu überprüfen, ob alle Abhängigkeiten erfolgreich installiert wurden. oder Sie könnten eine Prüffunktion für jede abhängige Installation schreiben, die dann false zurückgibt und damit alle anderen Installationen nach der ersten fehlgeschlagenen Installation überspringt.

Beachten Sie jedoch, dass alle [Run] Einträge ausgeführt werden, nachdem die Schritte zum Kopieren von Dateien, zum Schreiben von Registern usw. abgeschlossen sind, sodass Sie die Installation bereits abgeschlossen haben. Wenn Sie alle Installationsschritte nur ausführen möchten, wenn alle Abhängigkeiten korrekt installiert sind, müssen Sie dies früher tun, wenn die Installation noch abgebrochen werden kann.

Bearbeiten: Überprüfen Sie die Frage " Wie lässt man Inno Setup nicht eingefroren aussehen, während man einen langen Exec ausführt? ", wo einige Informationen gegeben werden und ein Beispielskript mit der Verwendung von Exec () -Funktion zum Installieren von Abhängigkeiten. Wenn Sie also keine [Run] Einträge verwenden, haben Sie eine gute Chance, das zu erreichen, was Sie wollen.

    
mghie 24.02.2009, 17:03
quelle
1

Sie können meine Antwort zu einer ähnlichen Frage verwenden, um Befehle im Abschnitt [Ausführen] mit entsprechender Benachrichtigung und Rollback sicher auszuführen Fehler.

Der obige Link bietet eine vollständige Lösung, aber die Idee folgt:

1) Schreiben Sie eine Fehlermeldung in die temporäre Datei {tmp} \ install.error mit dem Parameter BeforeInstall von InnoSetup.

2) Verwenden Sie die Windows-Befehlsshell "cmd.exe / s / c", um das gewünschte Programm auszuführen. Verwenden Sie auch die bedingte Ausführung des Befehls "del" mit "& amp; & amp;" - Ссылка . Die Fehlermeldung wird gelöscht, wenn der Befehl erfolgreich ausgeführt wird (Code 0 beenden). Bitte beachten Sie die spezielle Behandlung von Anführungszeichen in "cmd.exe / s / c".

3) Prüfen Sie das Vorhandensein der Fehlernachrichtendatei {tmp} \ install.error mit dem AfterInstall-Parameter von InnoSetup und brechen Sie die Installation mit ordnungsgemäßer Benachrichtigung oder Bestätigung (und optionalem Präsentieren der Protokolldatei) ab und führen Sie Rollback mit Exec (ExpandConstant ('{uninstalllex}) '), ...

4) Es sollten einige zusätzliche Schritte ausgeführt werden, wie das Überschreiben der InnoSetup-Funktion ShouldSkipPage (PageID: Integer), um die letzte Seite usw. auszublenden.

    
Ivan Samygin 20.06.2014 08:42
quelle

Tags und Links