Installieren Sie .msi aus dem Skript und erkennen Sie, wann die Installation abgeschlossen ist

7

Ich versuche ein Installationsskript zu erstellen. Ich möchte eine MSI-Datei, Python, installieren und dann andere Dinge installieren, nachdem Python installiert wurde. Ich sehe bereits, wie eine Befehlszeileninstallation durchgeführt wird . Allerdings msiexeckehrt sofort, auch wenn die Installation läuft noch. Wie würde ich den Abschluss einer MSI-Installation anhand eines Batch-Skripts erkennen?

Claudiu
quelle
Haben Sie überhaupt die Kontrolle über die MSI-Datei? Können Sie es zerlegen, modifizieren und neu verpacken?
John Gardeniers
Nein, es ist nicht meine MSI-Datei
Claudiu

Antworten:

10

Sie wissen nicht, wie Python die Weitergabe von Befehlen an Windows / DOS handhabt, aber unter Verwendung einer einfachen Batchdatei und des start /waitBefehls stoppt die Batchdatei und wartet, bis die MSI abgeschlossen ist, bevor Sie mit dem nächsten Schritt fortfahren.

Wenn Sie beispielsweise eine Haupt-App installieren möchten, gefolgt von einem Patch, wenn dieser fertig ist, und einem endgültigen Programm, wenn dieser fertig ist, fügen Sie diese Zeilen in eine cmd-Datei ein:

start /wait msiexec /i O12Conv.msi /qb
start /wait msiexec /p O12Convsp1-en-us.msp /qb
start /wait msiexec /i mpsetupedp.msi
GAThrawn
quelle
+1, Wenn Sie startauf den title"Bug" achten. Pfade, die ein Leerzeichen enthalten, werden als titleTeil der Befehlszeilenargumente interpretiert . Verwenden Sie etwas wie: start "" /wait msiexec /i some.msi /qbNur um sicherzustellen, dass titleeingestellt ist.
Jscott
@jscott Hatte noch nie von diesem Problem gehört, aber wir haben unsere Installationsprogramme immer auf einer bestimmten Installationsfreigabe gespeichert, und alle Ordnernamen auf dieser Freigabe sind streng 8.3 ohne Leerzeichen, da es so viele seltsame Macken mit schlechtem Verhalten gegeben hat In der Vergangenheit haben Installateure geschrieben, dass es einfacher war, alles einfach zu halten.
GAThrawn
0

Es ist schwierig und nicht zuverlässig, aber es gibt Möglichkeiten, die Existenz eines bestimmten Prozesses in der Prozessliste zu überwachen. Sie schreiben Ihre Schleife an NOOP, während Sie darauf warten, dass dieser Prozess nicht mehr vorhanden ist, und führen dann Ihre nächsten Schritte aus. Es gibt verschiedene Möglichkeiten, damit umzugehen.

Das SysInternals-Tool pslistzeigt Prozesse an, obwohl das Parsen der Ausgabe schwierig sein kann. PowerShell kann auf die .NET-APIs zugreifen, um die Prozessüberwachung über das get-processCmdlet durchzuführen.

Diese Methoden überwachen lediglich das Vorhandensein eines Prozesses, können nicht nach den Exit-Codes suchen und können daher nicht wissen, ob ein Prozess normal oder in einem Fehlerzustand beendet wurde oder nicht. Dazu müssen Sie alle von Ihnen angegebenen MSI-Protokolle verarbeiten, die generiert werden sollen, oder möglicherweise im Windows Even-Protokoll nach Fehlerereignissen suchen.

sysadmin1138
quelle
-1

Bei einer erfolgreichen Installation wird je nach Neustartoption einer der drei Codes zurückgegeben: 0,1641,3010. Bitte versuchen Sie, Ihr Skript so zu ändern, dass es im Gegenzug die Codes auslöst.

Suman85
quelle