Pregunta

Tengo un archivo ejecutable de instalación que tengo que instalar.Cuando lo ejecuto, se inicia una msi para hacer el proceso de instalación y, a continuación, muere inmediatamente.El efecto secundario de esto es que va a devolver el control a cualquier consola desde antes de la instalación de los acabados.Dependiendo de lo que la máquina ejecuta en, puede tomar de tres a diez minutos así que tener la vocación de secuencia de comandos de sueño es indeseable.Yo pondría en marcha la msi directamente sino que se queja sobre la falta de componentes.

Tengo un WSH secuencia de comandos que utiliza WMI para iniciar un proceso y, a continuación, ver hasta que la pid no está en ejecución.Hay alguna manera para determinar el pid de la MSI inicial ejecutable se ejecuta, y luego ver que el pid a finales mediante WMI?Es el inicio del proceso de la información asociada con un proceso?

¿Fue útil?

Solución

Sería hacer un WMI búsqueda de procesos que tienen la configuración inicial como el proceso primario que hacer el truco?Por ejemplo, si puedo iniciar una MSI desde un símbolo del sistema con proceso de identificación de 4000, puede ejecutar la siguiente línea de comandos para obtener información acerca de msiexec proceso:

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

Que puede ser una manera de encontrar la información que necesita.Aquí es una demostración de buscar esa información en 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

Espero que esto ayude.

Otros consejos

Si usted está usando un .NET lenguaje (puede hacerlo en Win32, pero muuuuy fácil en .NET) puede enumerar todos los Procesos en el sistema (después de su primera llamada a Setup.exe completa) y encontrar todos los procesos que padres PID igual a la PID de la Setup.exe - y, a continuación, supervisar todos los procesos.Cuando se completa la instalación es completa.Asegúrese de que no desovan más niño de los procesos.

Esto debe hacerlo.

$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

Por desgracia, la .NET objeto no tiene una ParentProcessId de la propiedad, y el objeto de WMI no tiene la WaitForExit() método, así que tenemos que ir hacia atrás y adelante.

Accesorios para Jeffrey Snover (siempre) para este artículo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top