Posted at

PowerShellで例外をキャッチしてエラーメッセージをイベントログに出力する

More than 3 years have passed since last update.

PowerShellで例外をキャッチしてエラーメッセージをイベントログに出力しておくと、なんかあとあとデバッグが捗る。

PowerShellで汎用的に例外をキャッチするには、なんか処理のあとに trap[Exception] でキャッチすれば、なんでも拾える。なんか処理の部分を特にtryとかで囲う必要はないです。

このとき $error[0].exception にエラーメッセージが入ってるので、これをイベンログに出力しておけばOK。イベントログを書くのは Write-EventLog で書く。

# なんか処理

...

# 例外をイベントログに出力
trap [Exception] {
Write-EventLog -LogName Application -Source MyApp -EventId 1 -EntryType Error -Message $error[0].exception
}

Write-EventLog で使うイベントソース(この例だとMyApp)は予めイベントログに登録しておく必要がある。(登録されていないものを指定するとエラーになる)

イベントソースの登録はPowerShellからやるには New-EventLog というのがあるのだけど、これは既に登録されてる場合にはエラーになるので、登録されていない場合だけ実行というハンドリングをしないといけなくて若干面倒くさいです。

簡単なのは、ツールのインストール処理とかに 複数回実行しても問題ないeventcreate コマンドでイベントログ出力をコマンドラインから1回実行しておくとソースが登録されるので、これが一番簡単かもです。

C:¥> eventcreate /l Application /so MyApp /t information /id 1 /d "create eventlog" > nul