PowerShell で RSS フィードを作成する方法
一昨日 Visual Studio 2008 ReadyDay が開催され、Visual Studio 2008 や .NET Framework 3.5 のさまざまな新機能が紹介されていました。その中のひとつに RSS を扱うためのクラスがあります。.NET Framework 3.5 で追加されています。
System.ServiceModel.Syndication 名前空間
http://msdn2.microsoft.com/
ja-jp/library/system.servicemodel.syndication.aspx WCF および .NET Framework 3.5 を使用した HTTP プログラミング
http://msdn.microsoft.com/msdnmag/issues/
08/01/WCFinOrcas/default.aspx?loc=jp
Windows PowerShell では XML のデータを簡単に扱えるため、RSS を生成するスクリプトを作ってみようと考えていたところに、さらに便利なクラスがあることが分かったため、さっそく使ってみることにします。
まずは準備から、
[Reflection.Assembly]::LoadWithPartialName("System.ServiceModel.Web") | Out-Null
$sss = "System.ServiceModel.Syndication."
最初に必要なアセンブリをロードしています。(コンソールへの出力を抑制するために、Out-Null につないでいます。)System.ServiceModel.Web.dll を使うためには、.NET Framework 3.5 (ダウンロードセンター) をインストールしておく必要があります。これ以降のスクリプトで、System.ServiceModel.Syndication という名前空間が何度か出てきますので、文字列変数に入れておきます。スクリプトが見やすくなると同時に、スペルミスを防止することができます。
$feed = new-object ($sss + "SyndicationFeed")
$feed.Title = "Event Logs"
$feed.LastUpdatedTime = [DateTimeOffset]::Now
次に、フィードオブジェクトを作成します。クラスは SyndicationFeed (MSDN ライブラリ) です。さまざまなプロパティがありますが、ここでは RSS フィードのタイトルと最終更新時刻を指定します。
そして、フィードの項目をセットしていきます。ここではイベントログを RSS フィードとして配信することにします。
Get-EventLog System -Newest 100 | `
foreach {
$item = new-object ($sss + "SyndicationItem")
$item.Title = "[{0}] {1}: {2}" -f $_.Index, $_.EntryType, $_.Source
$item.Authors.Add((new-object ($sss + "SyndicationPerson") `
($_.Source + "@" + $_.MachineName), $null, $null))
$item.Categories.Add((new-object ($sss + "SyndicationCategory") $_.EntryType))
$item.Categories.Add((new-object ($sss + "SyndicationCategory") $_.EventID))
$item.Categories.Add((new-object ($sss + "SyndicationCategory") $_.Source))
$item.PublishDate = $_.TimeGenerated
$item.Content = new-object ($sss + "TextSyndicationContent") $_.Message
$feed.items.add($item)
}
まず、Get-EventLog で、システムのイベントログから最新100件を取得します。行末の「`」は、次の行へ継続することを示します。
取得したイベントログのリストに対して、foreach で1つずつフィード項目として構成し、フィードに追加していきます。フィード項目のクラスは SyndicationItem (MSDN ライブラリ) です。SyndicationItem のプロパティにイベントログの情報をセットしていきます。
Title プロパティはタイトルです。イベントログの通番 (EventRecordID) とレベル・ソースを組み合わせてタイトルを生成しています。タイトルだけでもある程度情報が得られるようにしておくと見やすいと思います。
Authors プロパティはブログなどでは投稿者ですが、ここではソースとマシン名を組み合わせることにします。
Categories プロパティはカテゴリです。ブログなどではタグに相当します。ここでは、レベル・ID・ソースをカテゴリにセットしています。
PublishDate にログの発生時刻を、Content にログメッセージをセットしています。出来上がったフィード項目を、フィードオブジェクトの Items プロパティに追加します。
あとはファイルに出力するだけです。
$rssFormatter = new-object ($sss + "Rss20FeedFormatter") $feed
$rssFile = "c:\inetpub\wwwroot\logrss\rsstest.xml"
$rssWriter = [System.Xml.XmlWriter]::Create($rssFile)
$rssFormatter.WriteTo($rssWriter);
$rssWriter.close()
Rss20FeedFormatter クラス (MSDN ライブラリ) を使うと RSS 2.0 形式で出力されます。Atom10FeedFormatter クラス (MSDN ライブラリ) を使うと、Atom 1.0 形式で出力されます。
出力先は、ローカルコンピュータの IIS コンテンツフォルダ内の rsstest.xml とし、ローカルの IIS 経由でアクセスできるように設定しておきます。出力先をファイル名ではなく [Console]::Out とするとコンソールに出力されますので、スクリプト作成中など、すぐに出力結果が見たいときには便利です。
では Internet Explorer から http://localhost/logrss/rsstest.xml にアクセスしてみます。フィードとして表示されています。
カテゴリでフィルタリングできますので、あらかじめセットしておいた、ID・ソース・レベルに該当するものだけ表示させることができます。ソースが DHCP のものだけ表示させてみます。
このように、PowerShell からも .NET Framework 3.5 の新機能である SyndicationFeed を利用して、XML を直接操作せずに簡単に RSS フィードが作成できます。共有フォルダを監視して、新着ファイルを RSS としてフィードしたり、ポッドキャストのフィードを作成したりと、いろいろな使い方が考えられそうです。ぜひ活用してみてください。