Domanda

Ho un eseguibile di installazione che devo installare. Quando lo eseguo, avvia un msi per eseguire l'installazione effettiva e quindi muore immediatamente. L'effetto collaterale di questo è che restituirà il controllo a qualsiasi console da cui lo chiami prima che l'installazione finisca. A seconda della macchina su cui lo eseguo, possono essere necessari da tre a dieci minuti, quindi è indesiderabile avere lo script chiamante inattivo. Avrei avviato l'MSI direttamente ma si lamenta dei componenti mancanti.

Ho uno script WSH che utilizza WMI per avviare un processo e quindi guardare fino a quando il pid non è più in esecuzione. C'è un modo per determinare il pid dell'MSI che l'eseguibile iniziale sta eseguendo e quindi controllare che quel pid finisca con WMI? Le informazioni sul processo di avvio sono persino associate a un processo?

È stato utile?

Soluzione

Farebbe una ricerca WMI dei processi che hanno la configurazione iniziale come processo genitore farebbe il trucco? Ad esempio, se lancio un MSI da un prompt dei comandi con ID processo 4000, posso eseguire la seguente riga di comando per trovare informazioni sul processo msiexec:

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

Potrebbe essere un modo per trovare le informazioni di cui hai bisogno. Ecco una demo per cercare quelle informazioni 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

Spero che questo aiuti.

Altri suggerimenti

Se si utilizza un linguaggio .NET (è possibile farlo in Win32, ma è più facile in .NET) è possibile enumerare tutti i processi nel sistema (al termine della chiamata iniziale a Setup.exe) e trovare tutto i processi il cui PID del genitore è uguale al PID di Setup.exe e quindi monitorare tutti quei processi. Al termine, l'installazione è completa. Assicurati che non generino altri processi figlio.

Questo dovrebbe farlo.

$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

Sfortunatamente, l'oggetto .NET non ha una proprietà ParentProcessId e l'oggetto WMI non ha il metodo WaitForExit (), quindi dobbiamo andare avanti e indietro.

Propone a Jeffrey Snover (sempre) per questo articolo .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top