PowerShellで外部プロセスを実行して終了コードを取得する方法
あらすじ
Start-Processで実行した外部プロセスの終了コードのプロパティが存在せず取得できない問題に直面。
1 2 |
$proc = Start-Process -FilePath 'Unko.exe' -NoNewWindow -Wait Write-Host $proc.ExitCode # Check ExitCode. |
1 2 3 4 5 6 |
このオブジェクトにプロパティ 'ExitCode' が見つかりません。プロパティが存在することを確認してください。 + Write-Host $proc.ExitCode + ~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : NotSpecified: (:) [], PropertyNotFoundException + FullyQualifiedErrorId : PropertyNotFoundStrict |
参考
- powershell – Obtaining ExitCode using Start-Process and WaitForExit instead of -Wait – Stack Overflow
- .net – Start-Process / System.Diagnostics.Process ExitCode is $null with -NoNewWindow – Stack Overflow
方法
Start-Processのオプションに -PassThru
をつけるとExitCodeがnullにならなくなる。
1 2 |
$proc = Start-Process -FilePath 'Unko.exe' -NoNewWindow -PassThru -Wait Write-Host $proc.ExitCode # Check ExitCode. |
ただしこの方法だと外部プロセスの実行速度が遅くなり(理由は未調査…。)、
Forループ等で何回も実行する場合に問題が出るため次のように-Wait
オプションを抜いてプロセスハンドルをキャッシュして対処する。
1 2 3 4 |
$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にならないかをちゃんとした理由を調べる必要があります。
おわい