Question

Je dois installer un exécutable d'installation. Quand je le lance, il lance un MSI pour effectuer l’installation proprement dite, puis meurt immédiatement. Cela a pour effet secondaire de rendre le contrôle à toute console à partir de laquelle vous l'appelez avant la fin de l'installation. En fonction de la machine sur laquelle je l'exécute, cela peut prendre de trois à dix minutes, donc il n'est pas souhaitable de laisser le script d'appel en veille. Je lancerais le MSI directement mais il se plaint des composants manquants.

J'ai un script WSH qui utilise WMI pour démarrer un processus, puis le surveiller jusqu'à ce que son pid ne soit plus en cours d'exécution. Existe-t-il un moyen de déterminer le pid du fichier MSI que l'exécutable initial est en train d'exécuter et de surveiller ensuite la fin de ce pid avec WMI? Les informations sur le processus de lancement sont-elles même associées à un processus?

Était-ce utile?

La solution

Est-ce que faire une recherche WMI des processus ayant la configuration initiale comme processus parent ferait l'affaire? Par exemple, si je lance un MSI à partir d'une invite de commande portant l'ID de processus 4000, je peux exécuter la ligne de commande suivante pour rechercher des informations sur le processus msiexec:

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

C’est peut-être un moyen de trouver les informations dont vous avez besoin. Voici une démonstration de la recherche de cette information dans 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

J'espère que cela vous aidera.

Autres conseils

Si vous utilisez un langage .NET (vous pouvez le faire sous Win32, mais plus facilement sous .NET), vous pouvez énumérer tous les processus du système (après l’appel initial à Setup.exe) et rechercher tous les les processus dont le PID du parent est égal au PID de Setup.exe - puis surveillez tous ces processus. Quand ils auront terminé - la configuration est terminée. Assurez-vous qu’ils ne génèrent plus de processus enfants.

Cela devrait le faire.

$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

Malheureusement, l'objet .NET ne possède pas de propriété ParentProcessId et l'objet WMI ne dispose pas de la méthode WaitForExit (). Nous devons donc effectuer des va-et-vient.

Accessoires de Jeffrey Snover (toujours) pour cet article .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top