1

インストールする必要があるセットアップ実行可能ファイルがあります。実行すると、実際のインストールを行うために msi が起動され、すぐに終了します。これの副作用は、インストールが完了する前に、呼び出し元のコンソールに制御が戻ることです。実行するマシンによっては、3 ~ 10 分かかることがあるため、呼び出しスクリプトをスリープ状態にすることは望ましくありません。msi を直接起動しますが、コンポーネントが見つからないと文句を言います。

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

4

3 に答える 3

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

必要な情報を見つけるための 1 つの方法かもしれません。これは、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

これが役立つことを願っています。

于 2008-09-20T00:44:33.833 に答える
0

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

于 2008-09-20T00:46:50.257 に答える
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() メソッドがないため、行ったり来たりする必要があります。

この記事については、(常に) Jeffrey Snover に感謝します。

于 2008-09-20T04:30:27.410 に答える