2009-02-24 13 views
8

Ich möchte mehrere .msi-Dateien im unbeaufsichtigten Modus aufrufen und die gesamte Installation anhalten, wenn irgendwelche fehlschlagen.msi Rückkehrcodes in Inno-Setup

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

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

Antwort

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 Main.pas untersucht werden, die Funktion ist ProcessRunEntry(), beginnend mit 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 startet msiexec.exe mit den korrekten Parametern, wartet auf den Abschluss des Prozesses und schreibt dann den Rückkehrcode in eine Datei.

Eine weitere Möglichkeit für den Erfolg einer solchen Anlage Schritt zu prüfen, wäre eine benutzerdefinierte Prozeduraufruf für jeden [Run] unter Verwendung des Afterinstall Parameter Eintrag hinzuzufügen. In einer solchen Funktion kann man zum Beispiel prüfen, ob ein OCX-Steuerelement erfolgreich installiert wurde:

[Run] 
Filename: "{tmp}\MyInstallation1.exe"; Parameters: "/foo"; AfterInstall: AfterMyInstallation1 

[Code] 
var 
    MyInstallation1Success: boolean; 

procedure AfterMyInstallation1; 
var 
    V: Variant; 
begin 
    try 
    V := CreateOleObject('MyInstallation.InstalledOcxControl.1'); 
    MyInstallation1Success := True; 
    except 
    MyInstallation1Success := False; 
    end; 
end; 

oder ob die Verzeichnisse und Registry-Einträge für die Abhängigkeit alle da sind.

Jeder [Run] Eintrag wird nur dann, wenn seine optionalen Parameter true zurückgibt prüfen ausgeführt. 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 somit alle anderen Installationen nach dem ersten fehlgeschlagenen abbricht.

Beachten Sie jedoch, dass alle [Run] Einträge ausgeführt werden, nachdem die Schritte zum Kopieren von Dateien, Registrierung usw. abgeschlossen sind, so dass Sie im Grunde bereits mit der Installation abgeschlossen sind. 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.

Edit: die Frage prüfen Sie "How do you make Inno Setup not look frozen while performing a long Exec?" wo einige Informationen gegeben und ein Beispielskript verknüpft ist, über die Verwendung der Exec() Funktion für Abhängigkeiten zu installieren. Also, wenn Sie nicht [Run] Einträge verwenden, gibt es eine gute Chance zu erreichen, was Sie wollen.

+0

Dank mghie, ich glaube, dass das, was ich bin auf der Suche nach. Gibt es im Run-Bereich irgendwelche Haken zum Abbrechen? –

+0

Entschuldigung, ich habe meine Antwort bearbeitet, um weitere Informationen zu integrieren - es sieht so aus, als könnten Sie mit [Run] -Einträgen nicht wirklich machen, was Sie wollen. – mghie

1

Sie können my answer auf ähnliche Frage verwenden, um Befehle im Abschnitt [Ausführen] mit ordnungsgemäßer Benachrichtigung und Rollback bei Fehler sicher auszuführen.

Der Link bietet über vollständige Lösung, aber Idee ist Folowing:

1) Fehlermeldung in temporäre Datei {tmp} \ installieren.Fehler beim Verwenden des InnoSetup BeforeInstall-Parameters.

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 "& &" - . 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) Überprüfen Sie das Vorhandensein der Fehlernachrichtendatei {tmp} \ install.error mit dem AfterInstall-Parameter von InnoSetup und brechen Sie die Installation mit korrekter Benachrichtigung oder Bestätigung (und optionalem Präsentieren der Protokolldatei) ab und führen Sie Rollback mit Exec (ExpandConstant ('{uninstalllexe } '), ...

4) Es gibt einige zusätzliche Schritte wie zwingende InnoSetup des ShouldSkipPage (PageID getan werden sollte: Integer) Funktion zur letzten Seite zu verbergen, usw.

+0

Während dieser Link die Frage beantworten kann, ist es besser, die wesentlichen Teile der Antwort hier aufzunehmen und den Link als Referenz zur Verfügung zu stellen. Nur-Link-Antworten können ungültig werden, wenn sich die verknüpfte Seite ändert. – Uriil

+0

Danke für die Notiz. Ich habe eine allgemeine Ideenbeschreibung hier eingefügt. –