Frage

Ich habe eine ausführbare Setup, die ich installieren müssen. Wenn ich es starten, startet es eine msi die eigentliche Installation und dann stirbt sofort zu tun. Der Nebeneffekt dieser ist es die Kontrolle zurück zu jeder Konsole zurückkehren Sie es aus, bevor der Installer fertig nennen. Je nachdem, welche Maschine ich es lief auf, kann es drei bis zehn Minuten dauern, so ist der anrufende Skript Schlaf mit unerwünscht. Ich würde die msi direkt starten, aber es beschwert sich über fehlende Komponenten.

Ich habe einen WSH-Skript, das WMI verwendet einen Prozess zu starten und dann beobachten, bis es pid ist nicht mehr ausgeführt wird. Gibt es eine Möglichkeit, die pid des MSI die ursprüngliche ausführbare Datei ausgeführt wird, und dann sieht für die pid um zu bestimmen, WMI zu beenden verwenden? Ist der Start Prozessinformationen auch mit einem Prozess verbunden sind?

War es hilfreich?

Lösung

wäre eine WMI-Lookup von Prozessen zu tun, die die Ersteinrichtung als Mutter Prozess der Trick? Zum Beispiel, wenn ich ein MSI über eine Eingabeaufforderung mit Prozess-ID 4000 starte, kann ich die folgende Befehlszeile, um Informationen zu msiexec Prozess ausführen:

c:\>wmic PROCESS WHERE ParentProcessId=4000 GET CommandLine, ProcessId 
CommandLine                                                 ProcessId
"C:\Windows\System32\msiexec.exe" /i "C:\blahblahblah.msi"  2752

Das kann ein Weg sein, um die benötigten Informationen zu finden. Hier ist eine Demo von der Suche, dass die Informationen in vbs up:

Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")
Set colProcesses = objWMIService.ExecQuery("select * from Win32_Process where ParentProcessId = 4000")
For Each objProcess in colProcesses
    Wscript.Echo "Process ID: " & objProcess.ProcessId
Next

Ich hoffe, das hilft.

Andere Tipps

Wenn Sie eine .NET-Sprache verwenden (Sie können es in Win32, aber waaaay einfacher in .NET) Sie können im System alle Prozesse auflisten (nach dem ersten Aufruf von Setup.exe abgeschlossen) und finden Sie alle die Prozesse, die Eltern PID gleich der PID der Setup.exe - und dann überwachen alle diese Prozesse. Wenn sie komplett - Setup abgeschlossen ist. Stellen Sie sicher, dass sie nicht laichen keine weiteren Kind Prozesse.

Das sollte es tun.

$p1 = [diagnostics.process]::start($pathToExecutable) # this way we know the PID of the initial exe
$p2 = get-wmiobject win32_process -filter "ParentProcessId = $($p1.Id)" # using Jim Olsen's tip
(get-process -id $p2.ProcessId).WaitForExit() # voila--no messy sleeping

Leider ist das .NET-Objekt keiner ParentProcessId Eigenschaft hat, und das WMI-Objekt nicht über die WaitForExit () -Methode, also müssen wir hin und her gehen.

Requisiten zu Jeffrey Snover (immer) dieser Artikel .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top