Windows PowerShell でイベントログを取得する

「イベントログを取得するバッチ作って」って言われました。

イベントログ開いて右クリック→別名で保存でいいんじゃまいかとも思いましたが、まぁご要望らしいので。


イベントログを取得するコマンドは以下。

名前
    Get-EventLog

概要
    ローカル コンピューターまたはリモート コンピューター上のイベント ログまたはイベント ログの一覧のイベントを取得しま
    す。


構文
    Get-EventLog [-AsString] [-ComputerName <string[]>] [-List] [<CommonParameters>]

    Get-EventLog [-LogName] <string> [[-InstanceId] <Int64[]>] [-After <DateTime>] [-AsBaseObject] [-Before <DateTime>]
     [-ComputerName <string[]>] [-EntryType <string[]>] [-Index <Int32[]>] [-Message <string>] [-Newest <int>] [-Source
     <string[]>] [-UserName <string[]>] [<CommonParameters>]


説明
    Get-EventLog コマンドレットは、ローカル コンピューターおよびリモート コンピューター上のイベントおよびイベント ログ
    を取得します。

    プロパティ値を使用してイベントを検索するには、Get-EventLog のパラメーターを使用します。Get-EventLog は、指定された
    プロパティ値のすべてと一致するイベントのみを取得します。

    EventLog という名詞を含むコマンドレット (EventLog コマンドレット) は、従来のイベント ログでのみ有効です。Windows Vi
    sta 以降のバージョンで Windows イベント ログ技術を使用しているログからイベントを取得するには、Get-WinEvent を使用し
    ます。

簡単にイベントログを引っ張ってこれるんだけど、結構要らない情報もついてくる。
一旦、CSVXMLにexportしてから任意の列を取り出そうなんてコソコソ考えてたんだけど、同僚がもうちょっとシンプルに欲しい情報だけ引っ張ってこれるよーと教えてくれたのが以下。

#アプリケーションイベントログを取得
$logArray = Get-EventLog -ComputerName 192.168.0.1 -LogName "Application"  | Select-Object EntryType,EventID,Source,TimeGenerated,Message 

こんな感じに取得できる。

EntryType     : Information
EventID       : 9003
Source        : Desktop Window Manager
TimeGenerated : 2012/06/14 13:26:33
Message       : 合成テーマが使用されていないので、デスクトップ ウィンドウ マネージャを開始できませんでした

EntryType     : Information
EventID       : 9003
Source        : Desktop Window Manager
TimeGenerated : 2012/06/14 13:26:33
Message       : 合成テーマが使用されていないので、デスクトップ ウィンドウ マネージャを開始できませんでした
  • EntryType Error,Warning で、エラー警告のみとか、
  • newest 5 で、最新の5件とか、
  • After,-Before で日付を絞ったりできるのでお好みで。


続いてファイル出力。

#1件ずつ取り出して、ファイルに1行づつ書き出す
foreach ($row in $logArray)
{
    $line = [string]$row.EntryType + "," + [string]$row.EventID + "," + [string]$row.Source + "," + [string]$row.TimeGenerated + "," + [string]$row.Message
    #ファイル書込み
    $line | Out-File -filepath C:\tmp\eventLog.txt  -Append
}

C:\tmp\eventLog.txt の中身はこんな感じ。

Information,9003,Desktop Window Manager,06/14/2012 15:10:10,合成テーマが使用されていないので、デスクトップ ウィンドウ マネージャを開始できませんでした
Information,9003,Desktop Window Manager,06/14/2012 15:10:10,合成テーマが使用されていないので、デスクトップ ウィンドウ マネージャを開始できませんでした

select-objectで欲しい情報を選択して、foreachで回しながらそれぞれのオブジェクトをカンマ区切りで一行にしてtxtに追記していく。
あとはこのtxtをExcelにでも取り込んでいただければ調査しやすいと思う。

と、なかなか良い感じなのだが、Message(本文)の中に改行コードが入っているとそのままファイルに出力されてしまい、ちょっと残念な感じになってしまう。

改行コードを何とかしたいと思ったところで時間切れとなったのでまた明日格闘してみる。



それにしても、はてなってpowershellのハイライト表示とかできないのかなぁ?