PowerShellでイベントログを取得する時、「指定した選択条件に一致するイベントが見つかりませんでした。」が煩わしいのでcatchする



Windowsサーバーを点検する時など、イベントログをPowerShellで操作すると便利です。
Get-WinEventコマンドレットでイベントログを取得できますが、指定した条件に当てはまるイベントログがない場合、下記のエラーがスローされます。

Get-WinEvent : 指定した選択条件に一致するイベントが見つかりませんでした。

NoMatchingEventsFound,


NoMatchingEventsFoundが示すように、ただ指定した条件にマッチするイベントがなかっただけなので、条件としてエラーのレベルを「重大」や「エラー」にした場合は、特に問題ないことが多い。

エラーとして赤文字でコンソールに出力されるのは煩わしいので、catchする。
下記は、スクリプトの例。

$ErrorActionPreference = "Stop"
$today = Get-Date
$from = $today.AddMonths(-1)
$filter = @{LogName="system"; Level=1; StartTime=$from}
try {
    Get-WinEvent -FilterHashtable $filter
} catch {
    $category = $Global:Error[0].CategoryInfo.Category.ToString()
    if ($category -eq "ObjectNotFound") {
        # 問題ない
    } else {
        # Error Handling
    }
}

上の例では、過去1ヶ月分の、WIndowsログ→システムの、エラーレベルが「重大」のログを取得している。

下記の部分のsystemを「application」に変えれば、アプリケーションのログを取得できる。
また、Level=2、3とすることで、それぞれエラーレベルが「エラー」、「警告」のログを取得できる。

$filter = @{LogName="system"; Level=1; StartTime=$from}

StartTimeには、いつの日時からイベントログを取得するかを指定するが、上の例では、下記のように今日の日付を取得した後、AddMonthsで1を引き算して、$fromに設定しているので、1ヶ月前のログから取得することになる。

$today = Get-Date
$from = $today.AddMonths(-1)

下記の部分が実際にイベントログを取得する箇所である。
-FilterHashtable $filterで、$filterにhashtableとして設定した条件にマッチするイベントログを取得するように支持している。

Get-WinEvent -FilterHashtable $filter

$filterの条件にマッチするイベントログがなかった場合は、文頭に書いたエラーが発生する。
これを、catch構文でキャッチする。

try/catch構文を書いただけでは、catchできない。$ErrorActionPreferenceの値をStopにする必要がある。

$ErrorActionPreference = "Stop"

公式のドキュメントで説明されているように、エラーには終了するエラーと、終了しないエラーがある。
終了するエラーのみが例外として扱われ、catchでキャッチできるようだ。
ここで問題にしているObjectNotFoundは、終了しないエラーなので、try/catch構文を書いただけでは、キャッチできない。
終了しないエラーをどう扱うかは、$ErrorActionPreference 変数の値によって決定される。
デフォルトは「Continue」であり、この値の場合、エラーメッセージが表示され、例外は発生せず、処理が継続する。
$ErrorActionPreference = "Stop" とすることで、例外が発生するので、catchでキャッチ可能となる。

ErrorRecordクラスのCategoryInfo.Categoryプロパティーが「ObjectNotFound」だった場合は、イベントログがなかっただけと判定して、正常処理として扱っている。

catchされた例外が、イベントログがなかっただけなのか、それ以外のエラーなのかの判定の話だ。
このやり方がスマートな方法なのかは、わからない。

以上のように、PowerShellでイベントログを取得する時、「指定した選択条件に一致するイベントが見つかりませんでした。」が煩わしいのでcatchすることができました。

コメント

このブログの人気の投稿

PowerShell 6で、Shift_JISのCSVをImport-Csvで読み込んだら文字化けした

Windowsで、特定のユーザーに特定のサービスの再起動を許可する