PowerShellで外部プロセスを実行して終了コードを取得する方法

あらすじ

Start-Processで実行した外部プロセスの終了コードのプロパティが存在せず取得できない問題に直面。

$proc = Start-Process -FilePath 'Unko.exe' -NoNewWindow -Wait
Write-Host $proc.ExitCode   # Check ExitCode.
このオブジェクトにプロパティ 'ExitCode' が見つかりません。プロパティが存在することを確認してください。

+     Write-Host $proc.ExitCode
+     ~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], PropertyNotFoundException
    + FullyQualifiedErrorId : PropertyNotFoundStrict

参考

方法

Start-Processのオプションに -PassThru をつけるとExitCodeがnullにならなくなる。

$proc = Start-Process -FilePath 'Unko.exe' -NoNewWindow -PassThru -Wait
Write-Host $proc.ExitCode   # Check ExitCode.

ただしこの方法だと外部プロセスの実行速度が遅くなり(理由は未調査...。)、
Forループ等で何回も実行する場合に問題が出るため次のように-Waitオプションを抜いてプロセスハンドルをキャッシュして対処する。

$proc = Start-Process -FilePath 'Unko.exe' -NoNewWindow -PassThru
$handle = $proc.Handle # cache proc.Handle
$proc.WaitForExit()
Write-Host $proc.ExitCode   # Check ExitCode.

おわい

PowerShell経験が年齢に伴っていないので、なぜWaitを入れると実効速度低下につながるか、
なぜプロセスハンドルをキャッシュするとExitCodeがnullにならないかをちゃんとした理由を調べる必要があります。

おわい

シェアする

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

コメントする