1. ホーム
  2. powershell

[解決済み] Start-ProcessとWaitForExitを使ったExitCodeの取得 -Waitの代わりに

2023-05-04 16:04:29

質問

PowerShellからプログラムを実行し、終了を待って、ExitCodeにアクセスしようとしていますが、うまくいきません。私は -Wait Start-Process というように、バックグラウンドで何らかの処理を行う必要があるためです。

以下は簡単なテストスクリプトです。

cd "C:\Windows"

# ExitCode is available when using -Wait...
Write-Host "Starting Notepad with -Wait - return code will be available"
$process = (Start-Process -FilePath "notepad.exe" -PassThru -Wait)
Write-Host "Process finished with return code: " $process.ExitCode

# ExitCode is not available when waiting separately
Write-Host "Starting Notepad without -Wait - return code will NOT be available"
$process = (Start-Process -FilePath "notepad.exe" -PassThru)
$process.WaitForExit()
Write-Host "Process exit code should be here: " $process.ExitCode

このスクリプトを実行すると メモ帳 が起動します。 これを手動で閉じた後、終了コードが出力され、再び起動されます。 -wait . 終了時にExitCodeは出力されません。

Starting Notepad with -Wait - return code will be available
Process finished with return code:  0
Starting Notepad without -Wait - return code will NOT be available
Process exit code should be here:

プログラムを起動してから終了を待つ間に追加処理を行えるようにする必要があるので -Wait . どうすれば、この処理から .ExitCode プロパティにアクセスできるようになりますか?

どのように解決するのですか?

2つの方法があると思います。

  1. System.Diagnostics.Process オブジェクトを手動で作成し、Start-Process を回避する。
  2. バックグラウンド ジョブで実行ファイルを実行します (非インタラクティブ プロセスの場合のみ!)。

以下は、どちらかを行う方法です。

$pinfo = New-Object System.Diagnostics.ProcessStartInfo
$pinfo.FileName = "notepad.exe"
$pinfo.RedirectStandardError = $true
$pinfo.RedirectStandardOutput = $true
$pinfo.UseShellExecute = $false
$pinfo.Arguments = ""
$p = New-Object System.Diagnostics.Process
$p.StartInfo = $pinfo
$p.Start() | Out-Null
#Do Other Stuff Here....
$p.WaitForExit()
$p.ExitCode

または

Start-Job -Name DoSomething -ScriptBlock {
    & ping.exe somehost
    Write-Output $LASTEXITCODE
}
#Do other stuff here
Get-Job -Name DoSomething | Wait-Job | Receive-Job