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

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

注意

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

ここで説明するプロバイダーを使用すると、ユーザーは 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 つのパラメーターが含まれています。 1 番目のパラメーターは、このパラメーターで使用されるプロバイダーのユーザー Windows PowerShell。 2 番目のパラメーターは、Windows PowerShell実行時にプロバイダーがランタイムに公開する特定の機能Windows PowerShell指定します。 このプロバイダーに対して、追加Windows PowerShell固有の機能はありません。

基本機能の定義

「DESIGN Your PS Provider」で説明したように 、System.Management.Automation.Provider.Navigationcmdletprovider 基本クラスは、異なるプロバイダー機能を提供する他のいくつかのクラスから派生します。 したがってWindows PowerShellプロバイダーは、これらのクラスによって提供される機能を定義する必要があります。

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

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

項目の取得、設定、クリアなど、データ ストアの項目を操作するには、プロバイダーが 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*メソッドの実装では、プロバイダー名前空間の有効な完全修飾パスとしてパスを検証できません。 各パラメーターはパスの一部のみを表し、結合された部分では完全修飾パスが生成されない可能性があります。 たとえば、ファイルシステム プロバイダーの System.Management.Automation.Provider.Navigationcmdletprovider.Makepath* メソッドは、 パラメーターに "windows\system32" を、 パラメーターに "abc.dll" を受け取る場合 parent child があります。 メソッドは、これらの値を " " 区切り記号で結合し、完全修飾ファイル システム パスではない \ "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*メソッドの実装では、プロバイダー名前空間のパス区切り記号でパスを構文的に分割する必要があります。 たとえば、ファイル システム プロバイダーは、このメソッドを使用して最後の " " を探し、区切り記号の \ 左側にすべてを返します。

子パス名を取得する

ナビゲーション プロバイダーは 、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 を返し、パスがコンテナーを示す場合は 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-ItemSystem.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* プロパティが に設定されていない限り、ファイル システム プロバイダーは既存の c:\bar.txt ファイルに c:\temp\abc.txt をコピーしません true 。 パラメーターに指定されたパスが存在し、コンテナーである場合 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.Provider.Navigationcmdletprovider.Moveitemdynamicparameters* メソッドを実装して、指定されたパスの項目から必要なパラメーター値を取得し、コマンドレット クラスまたは System.Management.Automation.Runtimedefinedparameterdictionary オブジェクトと同様の解析属性を持つプロパティとフィールドを持つオブジェクトを返す必要があります。

このナビゲーション プロバイダーは、このメソッドを実装していない。 ただし、次のコードは 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. Employees データ Set-Location テーブルの場所を設定するには、 コマンドレットを再度使用します。

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

    Get-Location
    
    Path
    ----
    mydb:\Employees
    
  5. 次に、 Get-Childitem コマンドレットにパイプ処理された コマンドレットを使用 Format-Table します。 この一連のコマンドレットは、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. コマンドレットを実行して、Employees データ テーブル Get-Item の行 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 プロバイダーを設計する

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

Container Windows PowerShell プロバイダーを実装する

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

Windows PowerShell プログラマー ガイド

Windows PowerShell SDK