PowerShellジョブはバックグラウンドで実行されるタスクを扱うために便利な機能です。しかしジョブが失敗した場合にはエラーメッセージを取得して原因を解析する必要があります。本記事では、以前の投稿の付加機能としてPowerShellジョブが失敗した場合にエラーメッセージを取得する方法について解説します。
ジョブの状態に関する情報を取得する
ジョブが失敗した場合には、$jobStateInfo
オブジェクトからジョブの状態に関する情報を取得することができます。以下のように、$jobStateInfo
オブジェクトのプロパティを使用して情報を取得することができます。
$CheckJob = Start-Job { # ジョブの内容
}
# ジョブが完了するまで待機
Wait-Job $CheckJob
# ジョブの状態に関する情報を取得
$jobStateInfo = $CheckJob | Select-Object -ExpandProperty JobStateInfo
$jobStateInfo
オブジェクトには以下のプロパティが含まれます。
State
: ジョブの状態を表す文字列(Running
、Completed
、Failed
など)Reason
: ジョブが失敗した場合の理由を表す文字列Message
: ジョブが失敗した場合に表示されるメッセージを表す文字列ExitCode
: ジョブが終了した際の終了コードを表す数値
ジョブが失敗した場合には、$jobStateInfo.State
プロパティにFailed
が設定されます。$jobStateInfo.Reason
および$jobStateInfo.Message
プロパティにはジョブが失敗した原因に関する情報が含まれます。たとえば以下のようにしてジョブが失敗した場合にエラーメッセージを表示することができます。
if ($jobStateInfo.State -eq 'Failed') { Write-Host "ジョブが失敗しました。理由: $($jobStateInfo.Reason), メッセージ: $($jobStateInfo.Message)"
}
ジョブから出力されたエラーメッセージを取得する
ジョブが失敗した場合には、$jobStateInfo.Reason
および$jobStateInfo.Message
プロパティにエラーメーメッセージが含まれない場合があります。その場合はジョブから出力されたエラーメッセージを取得する必要があります。
ジョブから出力されたエラーメッセージを取得するには、Receive-Job
コマンドレットを使用します。以下のようにジョブから出力されたすべてのメッセージを取得することができます。
$CheckJob = Start-Job { # ジョブの内容
}
# ジョブが完了するまで待機
Wait-Job $CheckJob
# ジョブから出力されたすべてのメッセージを取得
$error_messages = Get-Job $CheckJob.Id | Receive-Job -ErrorAction SilentlyContinue -ErrorVariable errors
if ($errors.Count -gt 0) {
Write-Host "ジョブが失敗しました。エラーメッセージ: $($errors[0].ToString())"
}
Get-Job
コマンドレットを使用してジョブに関連するエラーメッセージを取得し、Receive-Job
コマンドレットを使用してジョブから出力されたエラーメッセージを取得します。取得したエラーメッセージは、$errors
変数に格納されます。その後、$errors
変数の要素数が1より大きい場合にはジョブが失敗したことを示すメッセージとともにエラーメッセージを出力します。
ジョブから出力された情報をフィルタリングする
ジョブから出力された情報は大量の情報を含む場合があります。そのため必要な情報のみを抽出する方法についても解説します。
たとえばジョブから出力されたメッセージにはエラーメッセージ以外の情報も含まれる場合があります。以下のように、Receive-Job
コマンドレットの-Keep
パラメータを使用して必要な情報のみを取得することができます。
$CheckJob = Start-Job { # ジョブの内容
Write-Output "メッセージ1"
Write-Output "エラーメッセージ"
Write-Output "メッセージ2"
}
# ジョブが完了するまで待機
Wait-Job $CheckJob
# ジョブから出力された情報をフィルタリング
$output_messages = Get-Job $CheckJob.Id | Receive-Job -Keep 'エラーメッセージ'
if ($output_messages.Count -gt 0) {
Write-Host "ジョブが失敗しました。エラーメッセージ: $($output_messages[0].ToString())"
}
Receive-Job
コマンドレットの-Keep
パラメメータを使用して取得するメッセージの種類を指定することができます。上記の例では、-Keep 'エラーメッセージ'
を指定してエラーメッセージのみを取得しています。取得したエラーメッセージは、$output_messages
変数に格納されます。
まとめ
PowerShellジョブが失敗した場合にはエラーメッセージを取得して原因を解析する必要があります。本記事ではジョブが失敗した場合のエラーメッセージを取得する方法について解説しました。$jobStateInfo
オブジェクトを使用してジョブの状態に関する情報を取得することができます。また、Receive-Job
コマンドレットを使用してジョブから出力されたエラーメッセージを取得することができます。必要に応じてジョブから出力された情報をフィルタリングすることもできます。