PowerShellで作るdeliciousクライアント その1

以前、PowerShellのカスタムプロバイダーという機構を紹介する記事を書きました。

この時は具体的なプロバイダーではなく、プロバイダー作成の概要を説明するという形でしたが、今回いい題材を思いついたのでその事を記事にしたいと思います。

今回作るプロバイダーは、SBS(ソーシャルブックマークサービス)のdeliciousのクライアントです。

このプロバイダーでは以下の操作ができます。

  • ブックマークの一覧を取得
  • ブックマークの追加・編集
  • ブックマークの削除
  • タグの一覧を取得
  • タグの編集
  • タグの削除

全部実装できるかどうかはわかりませんが、とりあえずやっていきましょう。開発言語にはVB.NET 2008(VB9)を使用します。開発環境については以前の記事を参考にして下さい。

注: 開発には、deliciousのアカウントが必要になります。

プロジェクトの作成

Visual Studio 2008を起動して、言語は「Visual Basic」で「クラス ライブラリ」プロジェクトを作成します。プロジェクト名は「PSDelicious」にします。

プロジェクトのプロパティを開いて、参照設定に以下のアセンブリを追加します。

  • System.Configuration.dll
  • System.Management.Automation.dll

また、以下の名前空間をインポート設定に追加しておきます。

プロジェクトの設定は以上です。

とりあえず動かす

では、とりあえずプロバイダークラスを作って、PowerShellに組み込んで動くようにしておきましょう。

「DeliciousProvider.vb」というファイル名でクラスファイルを追加します。このクラスはContainerCmdletProviderNavigationCmdletProviderクラスから派生させます*1

DeliciousProvider.vb

<CmdletProvider("Delicious", ProviderCapabilities.ShouldProcess Or ProviderCapabilities.Credentials)> _
Public Class DeliciousProvider
     Inherits ContainerCmdletProvider

     Protected Overrides Function IsValidPath(ByVal path As String) As Boolean
         Return True
     End Function

     Protected Overrides Function ItemExists(ByVal path As String) As Boolean
         Return True
     End Function

     Protected Overrides Function IsItemContainer(ByVal path As String) As Boolean
         Return True
     End Function
End Class

このクラスがプロバイダークラスである事を示す為に、CmdletProviderAttribute属性でマークしておきます。引数としてプロバイダー名とプロバイダーの種類(このプロバイダーでは認証機構を使用するのでCredentialsを指定)を指定しておきます。

IsValidPathメソッドをオーバーライドする必要があるので、とりあえずTrueを返しておきます。

あと、とりあえずこのドライブに移動(Set-Location)できるようにする為に、ItemExistsメソッドとIsItemContainerメソッドをオーバーライドしておきます(いずれもTrueを返すだけ)。

次にこのプロバイダークラスをPowerShellに登録するためのSnapInクラスを作ります。

「DeliciousSnapIn.vb」というファイル名でクラスファイルを追加します。このクラスはPSSnapInクラスから派生させます。

DeliciousSnapIn.vb
Imports System.ComponentModel

<RunInstaller(True)> _
Public Class DeliciousSnapIn
     Inherits PSSnapIn

     Public Overrides ReadOnly Property Name() As String
         Get
             Return "Delicious"
         End Get
     End Property

     Public Overrides ReadOnly Property Description() As String
         Get
             Return "deliciousプロバイダーなどを追加するスナップインです。"
         End Get
     End Property

     Public Overrides ReadOnly Property Vendor() As String
         Get
             Return "coma2n"
         End Get
     End Property
End Class

このクラスがインストーラクラスである事を示す為に、RunInstallerAttribute属性でマークしておきます。

以下の読み取り専用のプロパティをオーバーライドしておきます(必須)。

  • Name
  • Description
  • Vendor

ここまでで一度ビルドしておきましょう。

ビルドに成功したらPowerShellを起動して、このプロジェクトの「bin\Debug」フォルダに移動して下さい。そこで以下のコマンドを実行します。

PS Debug> installutil.exe PSDelicious.dll

コマンドが正常に完了すれば、スナップインのインストールが成功です。

では、インストールしたスナップインを読み込んでみましょう。以下のコマンドを実行して下さい。

PS Debug> Add-PSSnapIn Delicious
PS Debug> New-PSDrive delicious Delicious c:\temp


Name       Provider      Root                                                                           CurrentLocation
----       --------      ----                                                                           ---------------
delicious  Delicious     c:\temp

Add-PSSnapInコマンドレットで「Delicious」スナップインを読み込み、New-PSDriveコマンドレットで「Delicious」プロバイダーで「delicious」ドライブを作成しています。

「delicious」ドライブに移動できるか試してみ下さい。

PS > cd delicious:\
PS delicious:\> 

移動はできますが、その他のコマンドレット(例えばdir)を実行するとエラーになります。

それでは、機能を実装していきましょう。

長くなったので次回に続きます・・・

*1:SessionStateProviderBaseでもいいのですが、このクラスから派生するとPowerShellへのインストール時に何故かエラーが出てしまいます