2008-09-19 13 views
1

Ich habe eine Setup-Programmdatei, die ich installieren muss. Wenn ich es starte, startet es eine MSI, um die eigentliche Installation zu tun und stirbt dann sofort. Der Nebeneffekt davon ist, dass es die Kontrolle an jede Konsole zurückgibt, von der Sie es anrufen, bevor die Installation beendet ist. Abhängig davon, auf welcher Maschine ich es laufe, kann es zwischen drei und zehn Minuten dauern, so dass es unerwünscht ist, dass der aufrufende Skript-Schlaf funktioniert. Ich würde die MSI direkt starten, aber es beschwert sich über fehlende Komponenten.Möglich, Prozesse zu überwachen, startet ein anderer Prozess über WMI?

Ich habe ein WSH-Skript, das WMI verwendet, um einen Prozess zu starten und dann zu beobachten, bis es Pid nicht mehr ausgeführt wird. Gibt es eine Möglichkeit, die PID der MSI zu ermitteln, die die ursprüngliche ausführbare Datei ausführt, und dann zu beobachten, dass diese PID mithilfe von WMI beendet wird? Sind die Informationen zum Startvorgang überhaupt mit einem Prozess verbunden?

Antwort

1

Würden Sie eine WMI-Suche nach Prozessen durchführen, bei denen die Ersteinrichtung als übergeordneter Prozess ausgeführt wird? Zum Beispiel, wenn ich ein MSI über eine Eingabeaufforderung mit Prozess-ID 4000 starte, kann ich die folgende Befehlszeile, um Informationen zu msiexec Prozess auszuführen:

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

, dass ein Weg sein kann, die Informationen, die Sie finden müssen. Hier ist eine Demo zum Nachschlagen dieser Informationen in Vbs:

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.

0

Wenn Sie eine .NET-Sprache verwenden (Sie können es in Win32 tun, aber waaaay einfacher in .NET), können Sie alle Prozesse im System (nach dem ersten Aufruf von Setup.exe) auflisten und finden Alle Prozesse, deren Eltern-PID der PID der Setup.exe entspricht - und dann alle diese Prozesse überwachen. Wenn sie fertig sind - das Setup ist abgeschlossen. Stellen Sie sicher, dass sie keine weiteren untergeordneten Prozesse erzeugen.

0

Dies 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 nicht über eine ParentProcessId Eigenschaft, und das WMI-Objekt nicht über die WaitForExit() -Methode, also müssen wir hin und her gehen.

Requisiten zu Jeffrey Snover (immer) für this article.