Windows PowerShell コンテナー プロバイダーを作成する

このトピックでは、多層データ ストアでWindows PowerShellできるデータ プロバイダーを作成する方法について説明します。 この種類のデータ ストアの場合、ストアのトップ レベルにはルート項目が含まれており、後続の各レベルは子項目のノードと呼ばれます。 ユーザーがこれらの子ノードで作業できるようにすることで、ユーザーはデータ ストアを介して階層的に対話できます。

複数レベルのデータ ストアで動作できるプロバイダーは、コンテナー プロバイダー Windows PowerShell呼ばれます。 ただし、コンテナー プロバイダー Windows PowerShell使用できるのは、項目が含むコンテナーが 1 つ (入れ子になったコンテナーがない) 場合のみです。 入れ子になったコンテナーがある場合は、ナビゲーション プロバイダーにWindows PowerShell必要があります。 ナビゲーション プロバイダーの実装の詳細については、「Windows PowerShell ナビゲーション プロバイダーの作成」Windows PowerShell参照してください

注意

このプロバイダーの C# ソース ファイル (AccessDBSampleProvider04.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 」を参照してください

ここでWindows PowerShellコンテナー プロバイダーは、データベースを単一のコンテナーとして定義し、データベースのテーブルと行をコンテナーの項目として定義します。

注意事項

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

コンテナー プロバイダー Windows PowerShellの定義

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

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

このクラス定義では 、System.Management.Automation.Provider.Cmdletproviderattribute 属性に 2 つのパラメーターが含まれています。 1 番目のパラメーターは、このパラメーターで使用されるプロバイダーのユーザー Windows PowerShell。 2 番目のパラメーターは、Windows PowerShell実行時にプロバイダーがランタイムに公開する特定の機能Windows PowerShell指定します。 このプロバイダーに対して、追加Windows PowerShell固有の機能はありません。

基本機能の定義

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

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

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

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

子項目の取得

子項目を取得するには、Windows PowerShell コンテナー プロバイダーがSystem.Management.Automation.Provider.Containercmdletprovider.Getchilditems*メソッドをオーバーライドして、 コマンドレットからの呼び出しをサポートする必要 Get-ChildItem があります。 このメソッドは、データ ストアから子項目を取得し、それらをオブジェクトとしてパイプラインに書き込みます。 コマンドレットの パラメーターが指定されている場合、メソッドは、どのレベルにあるかに関係なく、すべての recurse 子を取得します。 パラメーターを recurse 指定しない場合、メソッドは 1 レベルの子のみを取得します。

このプロバイダーの System.Management.Automation.Provider.Containercmdletprovider.Getchilditems* メソッドの実装を次に示します。 パスが Access データベースを示す場合、このメソッドは、すべてのデータベース テーブルの子項目を取得し、パスがデータ テーブルを示す場合は、そのテーブルの行から子項目を取得します。

protected override void GetChildItems(string path, bool recurse)
{
    // If path represented is a drive then the children in the path are 
    // tables. Hence all tables in the drive represented will have to be
    // returned
    if (PathIsDrive(path))
    {
        foreach (DatabaseTableInfo table in GetTables())
        {
            WriteItemObject(table, path, true);

            // if the specified item exists and recurse has been set then 
            // all child items within it have to be obtained as well
            if (ItemExists(path) && recurse)
            {
                GetChildItems(path + pathSeparator + table.Name, recurse);
            }
        } // foreach (DatabaseTableInfo...
    } // if (PathIsDrive...
    else
    {
        // Get the table name, row number and type of path from the
        // path specified
        string tableName;
        int rowNumber;

        PathType type = GetNamesFromPath(path, out tableName, out rowNumber);

        if (type == PathType.Table)
        {
            // Obtain all the rows within the table
            foreach (DatabaseRowInfo row in GetRows(tableName))
            {
                WriteItemObject(row, path + pathSeparator + row.RowNumber,
                        false);
            } // foreach (DatabaseRowInfo...
        }
        else if (type == PathType.Row)
        {
            // In this case the user has directly specified a row, hence
            // just give that particular row
            DatabaseRowInfo row = GetRow(tableName, rowNumber);
            WriteItemObject(row, path + pathSeparator + row.RowNumber,
                        false);
        }
        else
        {
            // In this case, the path specified is not valid
            ThrowTerminatingInvalidPathException(path);
        }
    } // else
} // GetChildItems

GetChildItems の実装に関する注意

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

動的パラメーターを Get-ChildItem コマンドレットにアタッチする

Containercmdletprovider を呼び出すGet-ChildItemコマンドレットSystem.Management.Automation.Provider.Containercmdletprovider.Getchilditems*には、実行時に動的に指定される追加のパラメーターが必要な場合があります。 これらの動的パラメーターを指定するには、Windows PowerShell コンテナー プロバイダーがSystem.Management.Automation.Provider.Containercmdletprovider.Getchilditemsdynamicparameters*メソッドを実装する必要があります。 このメソッドは、指定されたパスにある項目の動的パラメーターを取得し、コマンドレット クラスまたは System.Management.Automation.Runtimedefinedparameterdictionary オブジェクトに似た属性を解析するプロパティとフィールドを持つオブジェクトを返します。 このWindows PowerShell返されたオブジェクトを使用して、コマンドレットにパラメーターを追加 Get-ChildItem します。

このWindows PowerShellプロバイダーは、このメソッドを実装していない場合があります。 ただし、次のコードは、このメソッドの既定の実装です。

子項目名の取得

子項目の名前を取得するには、Windows PowerShell コンテナー プロバイダーがSystem.Management.Automation.Provider.Containercmdletprovider.Getchildnames*メソッドをオーバーライドして、パラメーターが指定されている場合にコマンドレットからの呼び出しをサポートする必要があります。 Get-ChildItem Name このメソッドは、コマンドレットの パラメーターが指定されている場合は、指定したパスの子項目の名前、またはすべてのコンテナーの子項目 returnAllContainers 名を取得します。 子名はパスのリーフ部分です。 たとえば、パスの子名は "c:\windows\system32\abc.dll" abc.dll。 ディレクトリ c:\windows\system32 の子名は "system32" です。

このプロバイダーの System.Management.Automation.Provider.Containercmdletprovider.Getchildnames* メソッドの実装を次に示します。 指定したパスが Access データベース (ドライブ) を示し、パスがテーブルを示す場合は行番号を示す場合、メソッドはテーブル名を取得します。

protected override void GetChildNames(string path,
                              ReturnContainers returnContainers)
{
    // If the path represented is a drive, then the child items are
    // tables. get the names of all the tables in the drive.
    if (PathIsDrive(path))
    {
        foreach (DatabaseTableInfo table in GetTables())
        {
            WriteItemObject(table.Name, path, true);
        } // foreach (DatabaseTableInfo...
    } // if (PathIsDrive...
    else
    {
        // Get type, table name and row number from path specified
        string tableName;
        int rowNumber;

        PathType type = GetNamesFromPath(path, out tableName, out rowNumber);

        if (type == PathType.Table)
        {
            // Get all the rows in the table and then write out the 
            // row numbers.
            foreach (DatabaseRowInfo row in GetRows(tableName))
            {
                WriteItemObject(row.RowNumber, path, false);
            } // foreach (DatabaseRowInfo...
        }
        else if (type == PathType.Row)
        {
            // In this case the user has directly specified a row, hence
            // just give that particular row
            DatabaseRowInfo row = GetRow(tableName, rowNumber);

            WriteItemObject(row.RowNumber, path, false);
        }
        else
        {
            ThrowTerminatingInvalidPathException(path);
        }
    } // else
} // GetChildNames

GetChildNames の実装に関する注意

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

動的パラメーターを Get-ChildItem コマンドレット (名前) にアタッチする

コマンドレット ( Get-ChildItem パラメーターを使用 Name ) には、実行時に動的に指定される追加のパラメーターが必要な場合があります。 これらの動的パラメーターを指定するには、Windows PowerShell コンテナー プロバイダーがSystem.Management.Automation.Provider.Containercmdletprovider.Getchildnamesdynamicparameters*メソッドを実装する必要があります。 このメソッドは、指定されたパスにある項目の動的パラメーターを取得し、コマンドレットクラスまたは system.servicemodel 型の Parameterdictionary と同様に解析属性を持つプロパティとフィールドを持つオブジェクトを返します。 System.Management.Automation.Runtimedefinedparameterdictionaryオブジェクト。 このWindows PowerShell返されたオブジェクトを使用して、コマンドレットにパラメーターを追加 Get-ChildItem します。

このプロバイダーは、このメソッドを実装します。 ただし、次のコードは、このメソッドの既定の実装です。

項目の名前変更

項目の名前を変更するには、Windows PowerShell コンテナー プロバイダーがSystem.Management.Automation.Provider.Containercmdletprovider.Renameitem*メソッドをオーバーライドして、 コマンドレットからの呼び出しをサポートする必要 Rename-Item があります。 このメソッドは、指定したパスにある項目の名前を、指定された新しい名前に変更します。 新しい名前は、常に親項目 (コンテナー) を基準にした相対名である必要があります。

このプロバイダーでは 、System.Management.Automation.Provider.Containercmdletprovider.Renameitem* メソッドはオーバーライド されません。 ただし、既定の実装は次のとおりです。

RenameItem の実装に関する注意

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

動的パラメーターを Rename-Item コマンドレットにアタッチする

コマンドレットには Rename-Item 、実行時に動的に指定される追加のパラメーターが必要な場合があります。 これらの動的パラメーターを指定するには、Windows PowerShell プロバイダーがSystem.Management.Automation.Provider.Containercmdletprovider.Renameitemdynamicparameters*メソッドを実装する必要があります。 このメソッドは、指定されたパスにある項目のパラメーターを取得し、コマンドレット クラスまたは System.Management.Automation.Runtimedefinedparameterdictionary オブジェクトと同様の解析属性を持つプロパティとフィールドを持つオブジェクトを返します。 このWindows PowerShell返されたオブジェクトを使用して、コマンドレットにパラメーターを追加 Rename-Item します。

このコンテナー プロバイダーは、このメソッドを実装していない。 ただし、次のコードは、このメソッドの既定の実装です。

新しい項目の作成

新しい項目を作成するには、コンテナー プロバイダーが System.Management.Automation.Provider.Containercmdletprovider.Newitem* メソッドを実装して、 コマンドレットからの呼び出しをサポートする必要 New-Item があります。 このメソッドは、指定されたパスにあるデータ項目を作成します。 コマンドレット type の パラメーターには、新しい項目のプロバイダー定義型が含まれている。 たとえば、FileSystem プロバイダーは、"file" または "directory" の値を持 type つパラメーターを使用します。 コマンドレット newItemValue の パラメーターは、新しい項目のプロバイダー固有の値を指定します。

このプロバイダーの System.Management.Automation.Provider.Containercmdletprovider.Newitem* メソッドの実装を次に示します。

protected override void NewItem( string path, string type, object newItemValue )
{
    // Create the new item here after
    // performing necessary validations
    //
    // WriteItemObject(newItemValue, path, false);

    // Example
    //
    // if (ShouldProcess(path, "new item"))
    // {
    //      // Create a new item and then call WriteObject
    //      WriteObject(newItemValue, path, false);
    // }

} // NewItem
{
    case 1:
        {
            string name = pathChunks[0];

            if (TableNameIsValid(name))
            {
                tableName = name;
                retVal = PathType.Table;
            }
        }
        break;

    case 2:
        {
            string name = pathChunks[0];

NewItem の実装に関する注意

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

動的パラメーターを New-Item コマンドレットにアタッチする

コマンドレットには New-Item 、実行時に動的に指定される追加のパラメーターが必要な場合があります。 これらの動的パラメーターを指定するには、コンテナー プロバイダーが System.Management.Automation.Provider.Containercmdletprovider.Newitemdynamicparameters* メソッドを実装する必要 があります。 このメソッドは、指定されたパスにある項目のパラメーターを取得し、コマンドレット クラスまたは System.Management.Automation.Runtimedefinedparameterdictionary オブジェクトと同様の解析属性を持つプロパティとフィールドを持つオブジェクトを返します。 このWindows PowerShell返されたオブジェクトを使用して、コマンドレットにパラメーターを追加 New-Item します。

このプロバイダーは、このメソッドを実装します。 ただし、次のコードは、このメソッドの既定の実装です。

項目の削除

項目を削除するには、コマンドレットからの呼び出しをサポートするために、Windows PowerShell プロバイダーがSystem.Management.Automation.Provider.Containercmdletprovider.Removeitem*メソッドをオーバーライドする必要 Remove-Item があります。 このメソッドは、指定されたパスにあるデータ ストアから項目を削除します。 コマンドレットの パラメーターが に設定されている場合、 メソッドは、レベルに関係なくすべての子 recurse Remove-Item true 項目を削除します。 パラメーターが に設定されている場合、 false メソッドは、指定されたパスにある 1 つの項目のみを削除します。

このプロバイダーでは、項目の削除はサポートされていません。 ただし、次のコードは System.Management.Automation.Provider.Containercmdletprovider.Removeitem* の既定の実装です

RemoveItem の実装に関する注意

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

動的パラメーターを Remove-Item コマンドレットにアタッチする

コマンドレットには Remove-Item 、実行時に動的に指定される追加のパラメーターが必要な場合があります。 これらの動的パラメーターを指定するには、コンテナー プロバイダーが System.Management.Automation.Provider.Containercmdletprovider.Removeitemdynamicparameters* メソッドを実装して、これらのパラメーターを処理する必要があります。 このメソッドは、指定されたパスにある項目の動的パラメーターを取得し、コマンドレットクラスまたは system.servicemodel 型の Parameterdictionary と同様に解析属性を持つプロパティとフィールドを持つオブジェクトを返します。 System.Management.Automation.Runtimedefinedparameterdictionaryオブジェクト。 このWindows PowerShell返されたオブジェクトを使用して、コマンドレットにパラメーターを追加 Remove-Item します。

このコンテナー プロバイダーは、このメソッドを実装していない。 ただし、次のコードは System.Management.Automation.Provider.Containercmdletprovider.Removeitemdynamicparameters*の既定の実装です。

子項目のクエリ

指定したパスに子項目が存在しないか確認するには、Windows PowerShell コンテナー プロバイダーがSystem.Management.Automation.Provider.Containercmdletprovider.Haschilditems*メソッドをオーバーライドする必要があります。 このメソッドは、項目 true に子がある場合は を返し、それ以外 false の場合は を返します。 null または空のパスの場合、 メソッドはデータ ストア内のすべての項目を子と見なし、 を返します true

System.Management.Automation.Provider.Containercmdletprovider.Haschilditems*メソッドのオーバーライドを次に示します。 ChunkPath ヘルパー メソッドによって作成されたパス部分が 2 つ以上ある場合、データベース コンテナーとテーブル コンテナーだけが定義されているので、 メソッドは を false 返します。 このヘルパー メソッドの詳細については、「 Creating a Windows PowerShell Item Provider 」で ChunkPathメソッドを参照してください

protected override bool HasChildItems( string path )
{
    return false;
} // HasChildItems
        ErrorCategory.InvalidOperation, tableName));
}

return results;

HasChildItems の実装に関する注意

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

項目のコピー

項目をコピーするには、コンテナー プロバイダーが System.Management.Automation.Provider.ContainerCmdletProvider.CopyItem メソッドを実装して、 コマンドレットからの呼び出しをサポートする必要 Copy-Item があります。 このメソッドは、 コマンドレットの パラメーターで示される場所から、 パラメーターで示される path 場所にデータ項目をコピー copyPath します。 パラメーターが recurse 指定されている場合、 メソッドは、すべてのサブコンテナーをコピーします。 パラメーターを指定しない場合、メソッドは 1 レベルの項目のみをコピーします。

このプロバイダーは、このメソッドを実装します。 ただし、次のコードは System.Management.Automation.Provider.ContainerCmdletProvider.CopyItem の既定の実装です

CopyItem の実装に関する注意

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

動的パラメーターを Copy-Item コマンドレットにアタッチする

コマンドレットには Copy-Item 、実行時に動的に指定される追加のパラメーターが必要な場合があります。 これらの動的パラメーターを指定するには、Windows PowerShell コンテナー プロバイダーがこれらのパラメーターを処理するためにSystem.Management.Automation.Provider.Containercmdletprovider.Copyitemdynamicparameters*メソッドを実装する必要があります。 このメソッドは、指定されたパスにある項目のパラメーターを取得し、コマンドレット クラスまたは System.Management.Automation.Runtimedefinedparameterdictionary オブジェクトと同様の解析属性を持つプロパティとフィールドを持つオブジェクトを返します。 このWindows PowerShell返されたオブジェクトを使用して、コマンドレットにパラメーターを追加 Copy-Item します。

このプロバイダーは、このメソッドを実装します。 ただし、次のコードは System.Management.Automation.Provider.Containercmdletprovider.Copyitemdynamicparameters*の既定の実装です。

コード サンプル

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

Windows PowerShell プロバイダーの構築

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

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

Windows PowerShell プロバイダーが Windows PowerShell に登録されている場合は、コマンド ラインでサポートされているコマンドレットを実行してテストできます。 次の出力例では架空の Access データベースが使用されます。

  1. コマンドレットを Get-ChildItem 実行して、Access データベースの Customers テーブルから子項目の一覧を取得します。

    Get-ChildItem mydb:customers
    

    次のような出力が表示されます。

    PSPath        : AccessDB::customers
    PSDrive       : mydb
    PSProvider    : System.Management.Automation.ProviderInfo
    PSIsContainer : True
    Data          : System.Data.DataRow
    Name          : Customers
    RowCount      : 91
    Columns       :
    
  2. コマンドレットを Get-ChildItem 再度実行して、テーブルのデータを取得します。

    (Get-ChildItem mydb:customers).data
    

    次のような出力が表示されます。

    TABLE_CAT   : c:\PS\northwind
    TABLE_SCHEM :
    TABLE_NAME  : Customers
    TABLE_TYPE  : TABLE
    REMARKS     :
    
  3. 次に、 Get-Item コマンドレットを使用して、データ テーブルの行 0 にある項目を取得します。

    Get-Item mydb:\customers\0
    

    次のような出力が表示されます。

    PSPath        : AccessDB::customers\0
    PSDrive       : mydb
    PSProvider    : System.Management.Automation.ProviderInfo
    PSIsContainer : False
    Data          : System.Data.DataRow
    RowNumber     : 0
    
  4. 再利用 Get-Item して、行 0 の項目のデータを取得します。

    (Get-Item mydb:\customers\0).data
    

    次のような出力が表示されます。

    CustomerID   : 1234
    CompanyName  : Fabrikam
    ContactName  : Eric Gruber
    ContactTitle : President
    Address      : 4567 Main Street
    City         : Buffalo
    Region       : NY
    PostalCode   : 98052
    Country      : USA
    Phone        : (425) 555-0100
    Fax          : (425) 555-0101
    
  5. 次に、 コマンドレット New-Item を使用して、既存のテーブルに行を追加します。 パラメーターは行への完全なパスを指定し、テーブル内の既存の行数を超える行番号を示 Path す必要があります。 パラメーター Type は、追加する項目の種類を指定する "row" を示します。 最後に、 Value パラメーターは、行の列値のコンマ区切りのリストを指定します。

    New-Item -Path mydb:\Customers\3 -ItemType "row" -Value "3,CustomerFirstName,CustomerLastName,CustomerEmailAddress,CustomerTitle,CustomerCompany,CustomerPhone, CustomerAddress,CustomerCity,CustomerState,CustomerZip,CustomerCountry"
    
  6. 次のように、新しい項目操作の正しさを確認します。

    PS mydb:\> cd Customers
    PS mydb:\Customers> (Get-Item 3).data
    

    次のような出力が表示されます。

    ID        : 3
    FirstName : Eric
    LastName  : Gruber
    Email     : ericgruber@fabrikam.com
    Title     : President
    Company   : Fabrikam
    WorkPhone : (425) 555-0100
    Address   : 4567 Main Street
    City      : Buffalo
    State     : NY
    Zip       : 98052
    Country   : USA
    

参照

サービス プロバイダー Windows PowerShell作成する

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

アイテム プロバイダーのWindows PowerShell実装

ナビゲーション プロバイダー Windows PowerShell実装

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

Windows PowerShell SDK

Windows PowerShell プログラマー ガイド