いまさらですが、Windows PowerShellの勉強を始めました。
Windows Vistaまでは、マイクロソフトからダウンロードしてインストールする必要があった。
Windows Server 2008では標準でOSに含まれているが、機能の追加を行う必要がある。
しかしついに、Windows Server 2008 R2からはPowerShellが標準で有効化されている上に、無効化することが出来なかったはず。
いよいよPowerShellが標準のコマンド実行環境になる日も近い。
と言うわけで、いまさらですが勉強を開始しました。
まずは定番、コマンド一覧。
イベントログを取得するコマンドレットの詳細を表示。
PS C:\> get-help Get-EventLog -detailed : : |
対象のイベントログの種類の詳細
PS C:\> get-eventlog -list
Max(K) Retain OverflowAction Entries Name ------ ------ -------------- ------- ---- 20,480 0 OverwriteAsNeeded 5,520 アプリケーション 15,168 0 OverwriteAsNeeded 0 DFS レプリケーション 20,480 0 OverwriteAsNeeded 0 ハードウェア イベント 512 7 OverwriteOlder 0 Internet Explorer 20,480 0 OverwriteAsNeeded 0 Key Management Service 8,192 0 OverwriteAsNeeded 0 Media Center
20,480 0 OverwriteAsNeeded 39,791 システム 15,360 0 OverwriteAsNeeded 116 Windows PowerShell
PS C:\> |
イベントログ取得するときに指定するイベントログの名称一覧
PS C:\> get-eventlog -list -asString Application DFS Replication HardwareEvents Internet Explorer Key Management Service Media Center Security System Windows PowerShell PS C:\> |
環境変数の%userprofile%を、PowerShellの変数$UserProfileに代入。
PowerShellで直接%userprofile%などの環境変数は扱えないみたい。
PS C:\> $UserProfile = $env:UserProfile PS C:\> |
echoで変数の値が表示されるのはPowerShellでも同じ。
PS C:\> echo $UserProfile C:\Users\norimaki2000 PS C:\> |
システムのイベントログの最新の50行を、カンマ区切りでマイドキュメントのEventSys50Lines.csvにエクスポート。
まず-newest 50で最新の50行を取得し、それをパイプでexport-csvコマンドレットに渡してCSV形式にしている。
PS C:\> $UserProfile = $env:UserProfile PS C:\> get-eventlog -logname system -newest 50 |export-csv -encoding default -path $userprofile\Documents\EventSys50Lines.csv PS C:\> |
ここで-encoding defaultを指定しないと、PowerShell標準のASCIIコードでエンコードされるため、倭国語が文字化けしてしまう。
-encoding defaultを指定すると、システムのデフォルトであるシフトJISでエンコードされるため、倭国語が文字化けしなくなる。
何のデフォルトなのか少しややこしい。
これがシステムのデフォルトのエンコードを調べるコマンド。
確かにシフトJISになっている。
PS C:\> [System.Text.Encoding]::Default
BodyName : iso-2022-jp EncodingName : 倭国語 (シフト JIS) HeaderName : iso-2022-jp WebName : shift_jis WindowsCodePage : 932 IsBrowserDisplay : True IsBrowserSave : True IsMailNewsDisplay : True IsMailNewsSave : True IsSingleByte : False EncoderFallback : System.Text.InternalEncoderBestFitFallback DecoderFallback : System.Text.InternalDecoderBestFitFallback IsReadOnly : True CodePage : 932 PS C:\> |
今度は2009年8月16日の分だけのシステムイベントログを抽出し、カンマ区切りCSV形式でマイドキュメントのEventSys20090816.csvにエクスポート。
PS C:\> $UserProfile = $env:UserProfile PS C:\> get-eventlog -logname system | Where-Object { $_.TimeGenerated -like "2009/08/16*"}|export-csv -encoding default -path $userprofile\Documents\EventSys20090816.csv PS C:\> |
PowerShellで操作できる値は単なる文字列ではなく「オブジェクト」として、項目に対する値として保持されている。
上記ではWhere-Objectコマンドレットを使って、$_.TimeGeneratedの値が2009年8月16日のイベントだけを抽出している。
$_.TimeGeneratedはそのイベントが生成された日時。
どのような項目があるのかは、イベントログをformat-listにパイプで送ってみたらわかる。
PS C:\> Get-EventLog -logname system -newest 1 |format-list
Index : 39789 EntryType : Information EventID : 4201 Message : ネットワーク アダプタ Wireless Network Connection が ネットワークに 接続されており、通常の運用が開始されたことを、システムが検出しました。 Category : (0) CategoryNumber : 0 ReplacementStrings : {, Wireless Network Connection} Source : Tcpip TimeGenerated : 2009/08/16 21:02:54 TimeWritten : 2009/08/16 21:02:54
PS C:\> |
TimeGeneratedは時刻だけではなく、日付時刻型であることがわかる。
文字列ではなくオブジェクトだから、2009/08/16か2009/8/16なのかは悩む必要がない。
これは2009年8月12日の0:00:00以降のイベントログを取得するコマンド。
PS C:\> $UserProfile = $env:UserProfile PS C:\> get-eventlog -logname system | Where-Object { $_.TimeGenerated -ge "2009/08/12 00:00:00"}|export-csv -encoding default -path $userprofile\Documents\EventSys20090812ge.csv PS C:\> |
これは2009年8月12日の0:00:00から8月13日23:59のイベントログを取得するコマンド。
日時の開始と終了をandか何かでつなぐ事が出来ると思うんだけど、残念ながらよくわからなかったので、8月12日0:00以上を抽出して次の8月13日23:59以下の絞込みにつなげてみた。
PS C:\> $UserProfile = $env:UserProfile PS C:\> get-eventlog -logname system | Where-Object { $_.TimeGenerated -ge "2009/08/12 00:00:00"}| Where-Object { $_.TieGenerated -lt "2009/08/13 23:59:59"}|export-csv -encoding default -path $userprofile\Documents\EventSys20090812-0813.csv PS C:\> |
これは24時間以内のイベントログを抽出するコマンド。
get-dateで現在の日時が取得できる。
それに対して.addhours(-24)で過去24時間分を指定している。
PS C:\> $UserProfile = $env:UserProfile PS C:\> Get-EventLog -logname system | Where-Object { $_.TimeGenerated -gt (get-date).addhours(-24) } |export-csv -encoding default -path $userprofile\Documents\EventSys24Hours.csv PS C:\> |
これは3日以内のイベントログを抽出するコマンド。
get-dateに対して.adddays(-3)で過去3日分を指定している。
PS C:\> $UserProfile = $env:UserProfile PS C:\> Get-EventLog -logname system | Where-Object { $_.TimeGenerated -gt (get-date).adddays(-3) } |export-csv -encoding default -path $userprofile\Documents\EventSys3days.csv PS C:\> |
うーん、疲れた。
既にわかっていたことだけどPowerShellはコマンドの域ははるかに超えて、言語です。
俺は嫌なんだよなあ。
大昔にプログラムを作るのをやめてからと言うものの、言語らしいものに拒否感があるんだよなあ。