次の方法で共有


Windows PowerShell ナビゲーション プロバイダーの作成

このトピックでは、データ ストア内を移動できる Windows PowerShell ナビゲーション プロバイダーを作成する方法について説明します。 この種類のプロバイダーは、再帰コマンド、入れ子になったコンテナー、および相対パスをサポートします。

Windows Vista および .NET Framework 3.0 ランタイム コンポーネント用の Microsoft Windows ソフトウェア開発キットを使用して、このプロバイダーの C# ソース ファイル (AccessDBSampleProvider05.cs) をダウンロードできます。 ダウンロード手順については、「Windows PowerShell をインストールして Windows PowerShell SDKをダウンロードする方法」を参照してください。 ダウンロードしたソース ファイルは、<PowerShell Samples> ディレクトリにあります。 その他の Windows PowerShell プロバイダーの実装の詳細については、「Windows PowerShell プロバイダーの設計」を参照してください。

ここで説明するプロバイダーを使用すると、ユーザーは Access データベースをドライブとして処理できるため、ユーザーはデータベース内のデータ テーブルに移動できます。 独自のナビゲーション プロバイダーを作成するときに、ナビゲーションに必要なドライブ修飾パスを作成したり、相対パスを正規化したり、データ ストアの項目を移動したり、子名を取得したり、アイテムの親パスを取得したり、項目がコンテナーであるかどうかをテストしたりするメソッドを実装できます。

注意事項

この設計では、名前 ID を持つフィールドがあり、フィールドの型が LongInteger であるデータベースを想定していることに注意してください。

Windows PowerShell プロバイダーを定義する

Windows PowerShell ナビゲーション プロバイダーは、System.Management.Automation.Provider.NavigationCmdletProvider 基本クラスから派生する .NET クラスを作成する必要があります。 このセクションで説明するナビゲーション プロバイダーのクラス定義を次に示します。

[CmdletProvider("AccessDB", ProviderCapabilities.None)]
public class AccessDBProvider : NavigationCmdletProvider

このプロバイダーでは、System.Management.Automation.Provider.CmdletProviderAttribute 属性に 2 つのパラメーターが含まれていることに注意してください。 最初のパラメーターは、Windows PowerShell で使用されるプロバイダーのわかりやすい名前を指定します。 2 番目のパラメーターは、コマンド処理中にプロバイダーが Windows PowerShell ランタイムに公開する Windows PowerShell 固有の機能を指定します。 このプロバイダーでは、Windows PowerShell 固有の機能は追加されません。

基本機能の定義

PS プロバイダーの設計」で説明されているように、System.Management.Automation.Provider.NavigationCmdletProvider 基本クラスは、異なるプロバイダー機能を提供する他のいくつかのクラスから派生します。 そのため、Windows PowerShell ナビゲーション プロバイダーは、これらのクラスによって提供されるすべての機能を定義する必要があります。

セッション固有の初期化情報を追加したり、プロバイダーによって使用されるリソースを解放したりするための機能を実装するには、「基本 PS プロバイダーの作成」を参照してください。 ただし、ほとんどのプロバイダー (ここで説明するプロバイダーを含む) では、Windows PowerShell によって提供されるこの機能の既定の実装を使用できます。

Windows PowerShell ドライブを介してデータ ストアにアクセスするには、基本クラス System.Management.Automation.Provider.DriveCmdletProvider メソッドを実装する必要があります。 これらのメソッドの実装の詳細については、「Windows PowerShell ドライブ プロバイダーの作成」を参照してください。

アイテムの取得、設定、クリアなどのデータ ストアの項目を操作するには、System.Management.Automation.Provider.ItemCmdletProvider 基底クラスによって提供されるメソッドをプロバイダーが実装する必要があります。 これらのメソッドの実装の詳細については、「Windows PowerShell アイテム プロバイダーの作成」を参照してください。

データ ストアの子項目またはその名前、およびアイテムの作成、コピー、名前変更、削除を行うメソッドを取得するには、System.Management.Automation.Provider.ContainerCmdletProvider 基底クラスによって提供されるメソッドを実装する必要があります。 これらのメソッドの実装の詳細については、「Windows PowerShell コンテナー プロバイダーの作成」を参照してください。

Windows PowerShell パスの作成

Windows PowerShell ナビゲーション プロバイダーは、プロバイダー内部の Windows PowerShell パスを使用して、データ ストアの項目間を移動します。 プロバイダー内部パスを作成するには、Combine-Path コマンドレットからの呼び出しをサポートする System.Management.Automation.Provider.NavigationCmdletProvider.MakePath* メソッドをプロバイダーが実装する必要があります。 このメソッドは、親パスと子パスの間にプロバイダー固有のパス区切り記号を使用して、親パスと子パスを組み合わせてプロバイダー内部パスにします。

既定の実装では、パス区切り記号として "/" または "\" を持つパスを受け取り、パス区切り記号を "\" に正規化し、親パスと子パスの部分をそれらの間の区切り記号と組み合わせて、結合されたパスを含む文字列を返します。

このナビゲーション プロバイダーでは、このメソッドは実装されません。 ただし、次のコードは、System.Management.Automation.Provider.NavigationCmdletProvider.MakePath* メソッドの既定の実装です。

MakePath の実装に関する注意事項

System.Management.Automation.Provider.NavigationCmdletProvider.MakePath*の実装には、次の条件が適用される場合があります。

  • System.Management.Automation.Provider.NavigationCmdletProvider.MakePath* メソッドの実装では、プロバイダー名前空間の有効な完全修飾パスとしてパスを検証しないでください。 各パラメーターはパスの一部のみを表すことができるので、結合された部分によって完全修飾パスが生成されない場合があることに注意してください。 たとえば、FileSystem プロバイダーの System.Management.Automation.Provider.NavigationCmdletProvider.MakePath* メソッドは、parent パラメーターに "windows\system32" を、child パラメーターに "abc.dll" を受け取ることがあります。 このメソッドは、これらの値を "\" 区切り記号と結合し、"windows\system32\abc.dll" を返します。これは完全修飾ファイル システム パスではありません。

    重要

    System.Management.Automation.Provider.NavigationCmdletProvider.MakePath* の呼び出しで提供されるパス 部分には、プロバイダー名前空間で許可されていない文字が含まれている場合があります。 これらの文字はワイルドカード拡張に使用される可能性が最も高く、このメソッドの実装ではそれらを削除しないでください。

親パスの取得

Windows PowerShell ナビゲーション プロバイダーは、System.Management.Automation.Provider.NavigationCmdletProvider.GetParentPath* メソッドを実装して、指定されたプロバイダー固有のパス全体または部分的なパスの親部分を取得します。 このメソッドは、パスの子部分を削除し、親パス部分を返します。 root パラメーターは、ドライブのルートへの完全修飾パスを指定します。 マウントされたドライブが取得操作に使用されていない場合、このパラメーターは null または空にすることができます。 ルートが指定されている場合、メソッドはルートと同じツリー内のコンテナーへのパスを返す必要があります。

サンプル ナビゲーション プロバイダーは、このメソッドをオーバーライドしませんが、既定の実装を使用します。 パス区切り記号として "/" と "\" の両方を使用するパスを受け入れます。 最初に、"\" 区切り記号のみを持つパスを正規化し、最後の "\" で親パスを分割し、親パスを返します。

GetParentPath の実装について覚えておくために

System.Management.Automation.Provider.NavigationCmdletProvider.GetParentPath* メソッドの実装では、プロバイダー名前空間のパス区切り文字で構文的にパスを分割する必要があります。 たとえば、FileSystem プロバイダーは、このメソッドを使用して最後の "\" を検索し、すべてを区切り記号の左側に返します。

子パス名を取得する

ナビゲーション プロバイダーは、System.Management.Automation.Provider.NavigationCmdletProvider.GetChildName* メソッドを実装して、指定された完全または部分的なプロバイダー固有のパスにある項目の子の名前 (リーフ要素) を取得します。

サンプル ナビゲーション プロバイダーは、このメソッドをオーバーライドしません。 既定の実装を次に示します。 パス区切り記号として "/" と "\" の両方を使用するパスを受け入れます。 最初に、"\" 区切り記号のみを持つパスを正規化し、最後の "\" で親パスを分割し、子パス部分の名前を返します。

GetChildName の実装に関する注意事項

System.Management.Automation.Provider.NavigationCmdletProvider.GetChildName* メソッドの実装では、パス区切り記号で構文的にパスを分割する必要があります。 指定されたパスにパス区切り記号が含まれている場合、メソッドは変更されていないパスを返す必要があります。

重要

このメソッドの呼び出しで指定されたパスには、プロバイダー名前空間で無効な文字が含まれている可能性があります。 これらの文字は、ワイルドカード拡張または正規表現の一致に使用される可能性が最も高く、このメソッドの実装ではそれらを削除しないでください。

項目がコンテナーであるかどうかを判断する

ナビゲーション プロバイダーは、System.Management.Automation.Provider.NavigationCmdletProvider.IsItemContainer* メソッドを実装して、指定したパスがコンテナーを示しているかどうかを判断できます。 パスがコンテナーを表す場合は true、それ以外の場合は false を返します。 ユーザーは、指定されたパスに対して Test-Path コマンドレットを使用できるようにするには、このメソッドが必要です。

次のコードは、サンプル ナビゲーション プロバイダー System.Management.Automation.Provider.NavigationCmdletProvider.IsItemContainer* 実装を示しています。 このメソッドは、指定したパスが正しいこと、およびテーブルが存在するかどうかを確認し、パスがコンテナーを示す場合は true を返します。

protected override bool IsItemContainer(string path)
{
   if (PathIsDrive(path)) 
   { 
       return true; 
   }
   
   string[] pathChunks = ChunkPath(path);
   string tableName;
   int rowNumber;

   PathType type = GetNamesFromPath(path, out tableName, out rowNumber);
   
   if (type == PathType.Table)
   {
      foreach (DatabaseTableInfo ti in GetTables())
      {
          if (string.Equals(ti.Name, tableName, StringComparison.OrdinalIgnoreCase))
          {
              return true;
          }
      } // foreach (DatabaseTableInfo...
   } // if (pathChunks...

   return false;
} // IsItemContainer

IsItemContainer の実装に関する注意事項

ナビゲーション プロバイダーの .NET クラスは、System.Management.Automation.Provider.ProviderCapabilities 列挙型から ExpandWildcards、Filter、Include、Exclude のプロバイダー機能を宣言する場合があります。 この場合、System.Management.Automation.Provider.NavigationCmdletProvider.IsItemContainer* の実装では、パスが要件を満たしていることを確認する必要があります。 これを行うには、System.Management.Automation.Provider.CmdletProvider.Exclude* プロパティなど、適切なプロパティにアクセスする必要があります。

項目の移動

Move-Item コマンドレットをサポートするナビゲーション プロバイダーは、System.Management.Automation.Provider.NavigationCmdletProvider.MoveItem* メソッドを実装します。 このメソッドは、path パラメーターで指定された項目を、destination パラメーターで指定されたパスにあるコンテナーに移動します。

サンプル ナビゲーション プロバイダーは、System.Management.Automation.Provider.NavigationCmdletProvider.MoveItem* メソッドをオーバーライドしません。 既定の実装を次に示します。

MoveItem の実装に関する注意事項

ナビゲーション プロバイダーの .NET クラスは、System.Management.Automation.Provider.ProviderCapabilities 列挙型から ExpandWildcards、Filter、Include、Exclude のプロバイダー機能を宣言する場合があります。 この場合、System.Management.Automation.Provider.NavigationCmdletProvider.MoveItem* の実装では、パスが要件を満たしていることを確認する必要があります。 これを行うには、メソッドは適切なプロパティ (CmdletProvider.Exclude プロパティなど) にアクセスする必要があります。

既定では、System.Management.Automation.Provider.CmdletProvider.Force* プロパティが trueに設定されていない限り、このメソッドのオーバーライドは既存のオブジェクトの上にオブジェクトを移動しないでください。 たとえば、System.Management.Automation.Provider.CmdletProvider.Force* プロパティが trueに設定されていない限り、FileSystem プロバイダーは既存の C:\bar.txt ファイルに C:\temp\abc.txt をコピーしません。 destination パラメーターに指定されたパスが存在し、コンテナーである場合、System.Management.Automation.Provider.CmdletProvider.Force* プロパティは必要ありません。 この場合、System.Management.Automation.Provider.NavigationCmdletProvider.MoveItem* は、path パラメーターで示される項目を、destination パラメーターによって示されるコンテナーに子として移動する必要があります。

System.Management.Automation.Provider.NavigationCmdletProvider.MoveItem* メソッドの実装では、System.Management.Automation.Provider.CmdletProvider.ShouldProcess 呼び出し、データ ストアに変更を加える前にその戻り値を確認する必要があります。 このメソッドは、ファイルの削除など、システム状態に変更が加えられたときに操作の実行を確認するために使用されます。 System.Management.Automation.Provider.CmdletProvider.ShouldProcess は、変更するリソースの名前をユーザーに送信します。Windows PowerShell ランタイムでは、ユーザーに表示する必要がある内容を決定する際に、コマンド ライン設定または基本設定変数を考慮します。

System.Management.Automation.Provider.CmdletProvider.ShouldProcess の呼び出しが trueを返した後、System.Management.Automation.Provider.NavigationCmdletProvider.MoveItem* メソッドは、System.Management.Automation.Provider.CmdletProvider.ShouldContinue メソッドを呼び出す必要があります。 このメソッドは、操作を続行する必要があるかどうかのフィードバックを許可するメッセージをユーザーに送信します。 潜在的に危険なシステム変更の追加チェックとして、プロバイダー System.Management.Automation.Provider.CmdletProvider.ShouldContinue を呼び出す必要があります。

Move-Item コマンドレットへの動的パラメーターのアタッチ

Move-Item コマンドレットで、実行時に動的に提供される追加のパラメーターが必要な場合があります。 これらの動的パラメーターを指定するには、ナビゲーション プロバイダーは、指定されたパスにある項目から必要なパラメーター値を取得し、コマンドレット クラスまたは System.Management.Automation.RuntimeDefinedParameterDictionary オブジェクトと同様の解析属性を持つプロパティとフィールドを持つオブジェクトを返すために、System.Management.Automation.Provider.NavigationCmdletProvider.MoveItemDynamicParameters* メソッドを実装する必要があります。

このナビゲーション プロバイダーでは、このメソッドは実装されません。 ただし、次のコードは、System.Management.Automation.Provider.NavigationCmdletProvider.MoveItemDynamicParameters*の既定の実装です。

相対パスの正規化

ナビゲーション プロバイダーは、System.Management.Automation.Provider.NavigationCmdletProvider.NormalizeRelativePath* メソッドを実装して、path パラメーターに示されている完全修飾パスを、basePath パラメーターで指定されたパスに対する相対パスとして正規化します。 このメソッドは、正規化されたパスの文字列表現を返します。 path パラメーターが存在しないパスを指定すると、エラーが書き込まれます。

サンプル ナビゲーション プロバイダーは、このメソッドをオーバーライドしません。 既定の実装を次に示します。

NormalizeRelativePath の実装に関する注意事項

System.Management.Automation.Provider.NavigationCmdletProvider.NormalizeRelativePath* の実装では、path パラメーターを解析する必要がありますが、純粋に構文解析を使用する必要はありません。 このメソッドは、パスを使用してデータ ストア内のパス情報を検索し、大文字と小文字と標準化されたパス構文に一致するパスを作成するように設計することをお勧めします。

コード サンプル

完全なサンプル コードについては、AccessDbProviderSample05 コード サンプルを参照してください。

オブジェクトの種類と書式設定の定義

プロバイダーは、既存のオブジェクトにメンバーを追加したり、新しいオブジェクトを定義したりできます。 詳細については、「オブジェクト型の拡張との書式設定」を参照してください。

Windows PowerShell プロバイダーのビルド

詳細については、「コマンドレット、プロバイダー、およびホスト アプリケーションを登録する方法」を参照してください。

Windows PowerShell プロバイダーのテスト

Windows PowerShell プロバイダーが Windows PowerShell に登録されている場合は、コマンド ラインでサポートされているコマンドレット (派生によって使用可能になったコマンドレットを含む) を実行してテストできます。 この例では、サンプル ナビゲーション プロバイダーをテストします。

  1. 新しいシェルを実行し、Set-Location コマンドレットを使用して、Access データベースを示すパスを設定します。

    Set-Location mydb:
    
  2. 次に、Get-ChildItem コマンドレットを実行して、使用可能なデータベース テーブルであるデータベース項目の一覧を取得します。 テーブルごとに、このコマンドレットはテーブル行の数も取得します。

    Get-ChildItem | Format-Table RowCount, Name -AutoSize
    
    RowCount   Name
    --------   ----
         180   MSysAccessObjects
           0   MSysACEs
           1   MSysCmdbars
           0   MSysIMEXColumns
           0   MSysIMEXSpecs
           0   MSysObjects
           0   MSysQueries
           7   MSysRelationships
           8   Categories
          91   Customers
           9   Employees
        2155   Order Details
         830   Orders
          77   Products
           3   Shippers
          29   Suppliers
    
  3. Set-Location コマンドレットをもう一度使用して、Employees データ テーブルの場所を設定します。

    Set-Location Employees
    
  4. 次に、Get-Location コマンドレットを使用して Employees テーブルへのパスを取得します。

    Get-Location
    
    Path
    ----
    mydb:\Employees
    
  5. 次に、Format-Table コマンドレットにパイプされた Get-ChildItem コマンドレットを使用します。 この一連のコマンドレットは、テーブル行である Employees データ テーブルの項目を取得します。 これらは、Format-Table コマンドレットで指定された形式になります。

    Get-ChildItem | Format-Table RowNumber, PSIsContainer, Data -AutoSize
    
    RowNumber   PSIsContainer   Data
    ---------   --------------   ----
    0           False            System.Data.DataRow
    1           False            System.Data.DataRow
    2           False            System.Data.DataRow
    3           False            System.Data.DataRow
    4           False            System.Data.DataRow
    5           False            System.Data.DataRow
    6           False            System.Data.DataRow
    7           False            System.Data.DataRow
    8           False            System.Data.DataRow
    
  6. これで、Get-Item コマンドレットを実行して、Employees データ テーブルの行 0 の項目を取得できるようになりました。

    Get-Item 0
    
    PSPath        : AccessDB::C:\PS\Northwind.mdb\Employees\0
    PSParentPath  : AccessDB::C:\PS\Northwind.mdb\Employees
    PSChildName   : 0
    PSDrive       : mydb
    PSProvider    : System.Management.Automation.ProviderInfo
    PSIsContainer : False
    Data           : System.Data.DataRow
    RowNumber      : 0
    
  7. Get-Item コマンドレットをもう一度使用して、行 0 の項目の従業員データを取得します。

    (Get-Item 0).Data
    
    EmployeeID      : 1
    LastName        : Davis
    FirstName       : Sara
    Title           : Sales Representative
    TitleOfCourtesy : Ms.
    BirthDate       : 12/8/1968 12:00:00 AM
    HireDate        : 5/1/1992 12:00:00 AM
    Address         : 4567 Main Street
                      Apt. 2A
    City            : Buffalo
    Region          : NY
    PostalCode      : 98052
    Country         : USA
    HomePhone       : (206) 555-9857
    Extension       : 5467
    Photo           : EmpID1.bmp
    Notes           : Education includes a BA in psychology from
                      Colorado State University. She also completed "The
                      Art of the Cold Call."  Nancy is a member of
                      Toastmasters International.
    ReportsTo       : 2
    

こちらもご覧ください

Windows PowerShell プロバイダーの作成

Windows PowerShell プロバイダーの を設計する

オブジェクト型の拡張と書式設定

コンテナー Windows PowerShell プロバイダー を実装する

コマンドレット、プロバイダー、およびホスト アプリケーションを登録する方法

Windows PowerShell プログラマ ガイド

Windows PowerShell SDK の