2008-09-19 7 views
1

私はインストールが必要なセットアップ実行可能ファイルを持っています。私はそれを実行すると、実際にインストールを実行するmsiを起動し、すぐに終了します。この副作用は、インストールが完了する前に呼び出されたコンソールに制御を戻します。私が実行しているマシンによっては、3分から10分かかることがありますので、呼び出しスクリプトをスリープ状態にすることは望ましくありません。私はmsiを直接起動しますが、不足しているコンポーネントについては不平を言います。他のプロセスがWMI経由で起動するプロセスを監視できますか?

WMIを使用してプロセスを開始し、pidが実行されなくなるまでウォッチするWSHスクリプトがあります。最初の実行可能ファイルが実行されているMSIのpidを確認し、そのpidがWMIを使用して終了するのを監視する方法はありますか?起動プロセス情報はプロセスに関連付けられていますか?

答えて

1

親プロセスとして初期設定を持つプロセスのWMIルックアップを行うと、そのトリックを行いますか?私はプロセスID 4000でコマンドプロンプトからMSIを起動した場合、私は、msiexecのプロセスに関する情報を見つけるために、次のコマンドラインを実行することができます。

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

、必要な情報を見つけるための一つの方法であり得ること。

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 

この情報が役立つことを願っています。

0

.NET言語を使用している場合(Win32でも実行できますが、.NETでは簡単です)、システム内のすべてのプロセスを列挙して(Setup.exeの最初の呼び出しが完了した後)、親プロセスのPIDがSetup.exeのPIDと等しいすべてのプロセス - すべてのプロセスを監視します。それらが完了すると、セットアップが完了します。それ以上の子プロセスも生成しないようにしてください。

0

これはそれを行う必要があります。

$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 

残念ながら、.NETオブジェクトは、ParentProcessIdプロパティを持っていない、とWMIオブジェクトがWaitForExit()メソッドを持っていないので、私たちは前後に行かなければなりません。

this articleのための(常に)ジェフリースンバーへの小道具。

関連する問題