HOWTO · PowerShell
PowerShell で Start-Process から終了コードを取得する方法
この記事では、start-process cmdlet を使用してスクリプトを実行した後に終了コードを取得する方法について説明します。
このページの内容
PowerShell の Start-Process でプロセスの終了コードを取得するには、-PassThru でプロセスオブジェクトを受け取り、-Wait で処理の終了を待ちます。その後、オブジェクトの ExitCode プロパティを読み取ります。
$pwshPath = (Get-Process -Id $PID).Path
$workingDirectory = [System.IO.Path]::GetTempPath()
$process = Start-Process -FilePath $pwshPath -ArgumentList @('-NoProfile', '-Command', 'exit 7') -WorkingDirectory $workingDirectory -Wait -PassThru
"Exit code: $($process.ExitCode)"
Exit code: 7
この例では、現在の PowerShell 実行ファイルを一時的な作業ディレクトリで起動し、子プロセスに終了コード 7 を返すよう指定しています。現在の実行ファイルを使うため、cmd.exe など Windows 専用のプログラムに依存しません。また、作業ディレクトリを明示することで、呼び出し元の現在のディレクトリにも依存しません。実行したいプログラムに合わせて、実行ファイルと引数を置き換えてください。-Wait によって PowerShell は処理の終了を待ち、-PassThru によって ExitCode を読み取れるプロセスオブジェクトを返します。例の出力ラベル Exit code: 7 は英語のまま表示されます。終了コード 0 は慣例的に成功を表しますが、0 以外の値の意味はプログラムによって定義されます。
-Wait と -PassThru で終了コードを取得する
起動したプログラムの結果に応じて後続のスクリプト処理を変える場合は、この2つのパラメーターを併用します。-Wait は PowerShell が処理を続けるタイミングを制御し、-PassThru はプロセスオブジェクトを返します。プロセスの終了後に ExitCode を読み取ると、最終的な終了コードを取得できます。
$process.ExitCode を $exitCode に代入し、スクリプトで次に行う処理を決める前に 0 と比較します。条件は、プログラムで定義されている終了コードに合わせてください。0 以外の値に共通の意味はありません。エラーを示す場合もあれば、プログラムで定義された別の結果を示す場合もあります。
$LastExitCode では Start-Process の終了コードを取得できない理由
$LastExitCode は Start-Process によって設定されません。この変数が示すのは、現在の PowerShell セッションから直接実行したネイティブプログラムのうち、最後に実行したものの終了コードです。Start-Process で別のプロセスを起動しても、その終了コードを $LastExitCode から取得することはできません。
代わりに、Start-Process -PassThru が返すプロセスオブジェクトの ExitCode プロパティを使います。ネイティブプログラムを直接実行した場合は、そのプログラムの終了後に PowerShell が $LastExitCode を更新します。ただし、これは別の実行方法であり、Start-Process で起動したプロセスの結果を取得するものではありません。
WaitForExit() を使ってプロセスオブジェクトから終了コードを取得する
-Wait を省略してプロセスオブジェクトを保持し、ExitCode を読む前にその WaitForExit() メソッドを呼び出す方法もあります。待機する前に別の処理を行う必要がある場合に便利です。このメソッドは、そのプロセスが終了するまで処理をブロックします。
同じ処理は、-PassThru でプロセスを起動し、WaitForExit() を呼び出してから $process.ExitCode を読む順に行います。結果を取得したいプロセスに対応するオブジェクトを保持してください。この方法では $LastExitCode を使いません。この代替方法には、パケットに実行証拠がないため、個別の出力例は掲載していません。
まとめ
Start-Process で起動したプロセスの終了コードを取得するには、-PassThru と -Wait を併用し、返されたオブジェクトの ExitCode プロパティを読み取ります。または、そのオブジェクトで WaitForExit() を呼び出してからプロパティを読み取ることもできます。$LastExitCode が対象とするのは PowerShell から直接実行したネイティブプログラムであり、Start-Process で起動したプロセスではありません。