PowerShellジョブが失敗した場合のエラーメッセージを取得する方法

PowerShellジョブはバックグラウンドで実行されるタスクを扱うために便利な機能です。しかしジョブが失敗した場合にはエラーメッセージを取得して原因を解析する必要があります。本記事では、以前の投稿の付加機能としてPowerShellジョブが失敗した場合にエラーメッセージを取得する方法について解説します。

ジョブの状態に関する情報を取得する

ジョブが失敗した場合には、$jobStateInfoオブジェクトからジョブの状態に関する情報を取得することができます。以下のように、$jobStateInfoオブジェクトのプロパティを使用して情報を取得することができます。

$CheckJob = Start-Job {    # ジョブの内容
}

# ジョブが完了するまで待機
Wait-Job $CheckJob

# ジョブの状態に関する情報を取得
$jobStateInfo = $CheckJob | Select-Object -ExpandProperty JobStateInfo

$jobStateInfoオブジェクトには以下のプロパティが含まれます。

  • State: ジョブの状態を表す文字列(RunningCompletedFailedなど)
  • 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コマンドレットを使用してジョブから出力されたエラーメッセージを取得することができます。必要に応じてジョブから出力された情報をフィルタリングすることもできます。

タイトルとURLをコピーしました