前回の続きです。

今回はSet-Contentコマンドレットへの対応からはじめます。

 

Set-Contentコマンドレットへの対応

Set-Contentコマンドレットに対応するには、IContentCmdletProviderインターフェースの以下のメソッドを実装します。

  • void ClearContent
  • IContentWriter GetContentWriter(string path)
  • object GetContentWriterDynamicParameters(string path)

Set-Contentコマンドレットはファイルの内容を置き換える為、GetContentWriterメソッドが呼び出される前にClearContentメソッドが呼び出されて、コンテントの内容をクリアするようになっています。 なのでClearContentメソッドを実装する必要があります。

まずはIContentWriterインターフェースを実装したクラスを定義します。

IContentWriterインターフェースには以下のメソッドが定義されています。

  • void Close()
  • void Seek(long offset, SeekOrigin origin) 
  • IList Write(IList content)

まずは、このインターフェースを実装したクラスを定義します。

using System;
using System.IO;
using System.Text;
using System.Management.Automation.Provider;
using System.Collections;

namespace PSHoge {
     public class HogeFileContentWriter : IContentWriter {
         private StreamWriter sw;

         public HogeFileContentWriter(string path, Encoding encoding) {
             sw = new StreamWriter(path, true, encoding);
         }
         ~HogeFileContentWriter() {
             Dispose();
         }

         public void Close() {
             if(sw != null) {
                 sw.Close();
                 sw = null;
             }
         }
         public void Seek(long offset, SeekOriginorigin) {
             throw new NotImplementedException();
         }
         public IList Write(IList content) {
             foreach(var c in content) {
                 sw.WriteLine(c.ToString());
             }
             return null;
         }

         public void Dispose() {
             Close();

             GC.SuppressFinalize(this);
         }
     }
}

コンストラクタでファイル名とエンコードを指定し、ファイルを追記モードで開いています。

Writeメソッドではリストで渡された要素の数だけファイルに内容を出力しています。 あとはお馴染みですね。

今回は始めから動的パラメータも定義しておきます。

[Serializable]
[DebuggerStepThrough]
public class SetContentParameters : FileSystemContentWriterDynamicParameters {
}

FileSystemContentWriterDynamicParametersクラスから派生しておくと楽ができます。

ClearContent、GetContentWriterメソッドを実装します。

public void ClearContent(string path) {
     if(File.Exists(path)) File.Delete(path);
}

public IContentWriter GetContentWriter(string path) {
     var scParams = base.DynamicParameters as SetContentParameters;
     var encoding = scParams != null ? scParams.EncodingType : Encoding.UTF8;

     return new HogeFileContentWriter(path, encoding);
}

public object GetContentWriterDynamicParameters(string path) {
     return new SetContentParameters();
}

ClearContentメソッドではファイルを削除しています。

GetContentWriterメソッドではHogeFileContentWriterクラスをインスタンス化して返しておきます。

デバッグ実行して、以下のように動作を確認できます。

PS Hoge:\> Set-Content 400.txt hoge

これでSet-Contentコマンドレットに対応できました。

 

まとめ

ここまでカスタムプロバイダーの作り方について説明してきましたが、いかかでしょうか?だいたいイメージは掴めたのではないでしょうか。

カスタムプロバイダーを作るための手順をまとめておきます。

  1. NavigationCmdletProviderクラスから派生して、プロバイダークラスを作る。
    1. IsValidPathメソッドをオーバーライドする。
    2. Set-LocationできるようにItemExistsIsItemContainerメソッドをオーバーライドする。
    3. 各コマンドレットに対応したメソッドをオーバーライドする。
      Get-ChildItem
      コマンドレットならGetChildItemsメソッド
      New-ItemコマンドレットならNewItemメソッドという具合
  2. PSSnapInクラスから派生してインストーラクラスを作る。
  3. InstallUtil.exeを使ってアセンブリをPowerShellにインストールする。
  4. Add-PSSnapinコマンドレットを使ってスナップインを追加する。
  5. New-PSDriveコマンドレットでカスタムプロバイダーのPSDriveを追加する。

といった感じです。

今回説明した以外にもNew-PSDriveに対応するNewDriveメソッドをオーバーライドして、PSDriveを追加する時の条件を変更できたりもします。

他にもパスの区切り記号の変更などもできたりもします(デフォルトでは円記号)。

カスタムプロバイダーを作る上で最も難しい事はどのようなデータソースをプロバイダーで抽象化するかということでしょう。

例えば、SQL Serverであったり、FTPサイトであったり、WebDAV、Amazon S3など色々と考える事ができます。結局のところはアイデア勝負ということです。

何か抽象化できそうなデータソースがあれば、試しにカスタムプロバイダーを作ってみることをお勧めします。

それでは楽しいPowerShellライフを!!

 

ソース


目次


Posted in:   Tags:

最新のブログ

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

コメント

2008/10/23 22:28:38

非常にわかりやすく、いい記事でした。
楽しく読ませていただきました。
何か1つ自作プロバイダ作ってみたいと思います。

次はどんなネタを提供していただけるか非常に楽しみです。

HIRO jp

2008/10/24 9:06:57

> 非常にわかりやすく、いい記事でした。
ありがとうございます!

本当はもっと具体的なプロバイダーを例にしたかったんですけど、複雑になりそうだったので単純なものにしました。

> 次はどんなネタを提供していただけるか非常に楽しみです。
おおう、プレッシャーですねwなんか考えときます。

coma2n

コメントを書く


 

  Country flag

biuquote
  • コメント
  • プレビュー
Loading



Calendar

«  1月 2009  »
月曜火曜水曜木曜金曜土曜日曜
2930311234
567891011
12131415161718
19202122232425
2627282930311
2345678
View posts in large calendar

Recent Posts

Recent Comments

Banners

Theme Grabber
Disclaimer
The opinions expressed herein are my own personal opinions and do not represent my employer's view in anyway.

© Copyright 2009 PowerShell from Japan!!