Pergunta

Eu tenho um executável de configuração que eu preciso para instalar. Quando eu executá-lo, ele lança um msi para fazer a instalação real e depois morre imediatamente. O efeito colateral disso é que vai devolver o controle de volta para qualquer console que você chamá-lo de antes da instalação terminar. Dependendo do que máquina que eu executá-lo em, pode demorar de três a dez minutos para ter o sono de script chamando é indesejável. Eu iria lançar o MSI diretamente mas reclama de componentes em falta.

Eu tenho um script WSH que usa WMI para iniciar um processo e depois ver até que é pid não está em execução. Existe alguma maneira para determinar o pid da MSI o executável inicial está em execução, e em seguida, prestar atenção para que pid para acabar usando WMI? É a informação processo de lançamento ainda associada a um processo?

Foi útil?

Solução

Será que fazer uma consulta WMI de processos que têm a configuração inicial como o processo pai fazer o truque? Por exemplo, se eu lançar um MSI a partir de um prompt de comando com identificação de processo 4000, posso executar a seguinte linha de comando para encontrar informações sobre o processo msiexec:

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

Isso pode ser uma maneira de encontrar a informação que você precisa. Aqui está uma demonstração de procurar essa informação em 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 isso ajude.

Outras dicas

Se você estiver usando uma linguagem .NET (você pode fazê-lo em Win32, mas waaaay mais fácil em .NET), você pode enumerar todos os processos no sistema (após a sua chamada inicial para concluído setup.exe) e encontrar todas os processos que PID pai igual ao PID do Setup.exe - e então monitorar todos os processos. Quando eles vão completar - a instalação estiver concluída. Certifique-se de que eles não geram quaisquer processos mais criança também.

Isso deve fazê-lo.

$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

Infelizmente, o objeto .NET não tem uma propriedade ParentProcessId, eo objeto WMI não tem o método WaitForExit (), então temos que ir e voltar.

Props para Jeffrey Snover (sempre) para este artigo .

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top