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*の実装には、次の条件が適用される場合があります。
プロバイダー クラスを定義するときに、Windows PowerShell コンテナー プロバイダーは、System.Management.Automation.Provider.Providercapabilities列挙体から ExpandWildcards、Filter、Include、または Exclude のプロバイダー機能を宣言する場合があります。 このような場合 、System.Management.Automation.Provider.Containercmdletprovider.Getchilditems* メソッドの実装では、メソッドに渡されるパスが指定された機能の要件を満たしていることを確認する必要があります。 これを行うには、メソッドが適切なプロパティ (System.Management.Automation.Provider.Cmdletprovider.Exclude* や System.Management.Automation.Provider.Cmdletprovider.Include* プロパティなど) にアクセスする必要があります。
このメソッドの実装では、項目がユーザーに表示される可能性がある項目への任意の形式のアクセスを考慮する必要があります。 たとえば、ユーザーがファイルシステムプロバイダー (Windows PowerShell によって提供される) を介してファイルに対する書き込みアクセス権を持っていても、 System.Management.Automation.Provider.Itemcmdletprovider.Itemexists*読み取りアクセス権を持っていない場合、ファイルはまだ存在しています
true。 実装では、子を列挙できるのか確認するために親項目のチェックが必要になる場合があります。複数の項目を記述する場合 、System.Management.Automation.Provider.Containercmdletprovider.Getchilditems* メソッドに時間がかかる場合があります。 System.Management.Automation.Provider.Cmdletprovider.Writeitemobject*メソッドを使用して項目を一度に 1 つ記述するプロバイダーを設計できます。 この手法を使用すると、ストリーム内のユーザーに項目が表示されます。
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*の実装には、次の条件が適用される場合があります。
プロバイダー クラスを定義するときに、Windows PowerShell コンテナー プロバイダーは、System.Management.Automation.Provider.Providercapabilities列挙体から ExpandWildcards、Filter、Include、または Exclude のプロバイダー機能を宣言する場合があります。 このような場合 、System.Management.Automation.Provider.Containercmdletprovider.Getchilditems* メソッドの実装では、メソッドに渡されるパスが指定された機能の要件を満たしていることを確認する必要があります。 これを行うには、メソッドが適切なプロパティ (System.Management.Automation.Provider.Cmdletprovider.Exclude* や System.Management.Automation.Provider.Cmdletprovider.Include* プロパティなど) にアクセスする必要があります。
注意
この規則の例外は、コマンドレットの
returnAllContainersパラメーターが指定されている場合に発生します。 この場合、 メソッドは 、System.Management.Automation.Provider.Cmdletprovider.Filter*プロパティ 、System.Management.Automation.Provider.Cmdletprovider.Include*プロパティ、 または System.Management.Automation.Provider.Cmdletprovider.Exclude* プロパティの値と一致しない場合でも、コンテナーの子名を取得する必要があります。既定では、このメソッドのオーバーライドでは 、System.Management.Automation.Provider.Cmdletprovider.Force* プロパティが指定されていない限り、一般にユーザーから非表示にされているオブジェクトの名前を取得する必要があります。 指定したパスがコンテナーを示す場合 、System.Management.Automation.Provider.Cmdletprovider.Force* プロパティは必要ありません。
System.Management.Automation.Provider.Containercmdletprovider.Getchildnames*の実装は、循環リンクなどがある場合に無限再帰を防ぐ役割を担います。 このような条件を反映するには、適切な終了例外をスローする必要があります。
動的パラメーターを 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* の実装には、次の条件が適用される場合があります。
プロバイダー クラスを定義するときに、Windows PowerShell コンテナー プロバイダーは、System.Management.Automation.Provider.Providercapabilities列挙体から ExpandWildcards、Filter、Include、または Exclude のプロバイダー機能を宣言する場合があります。 このような場合 、System.Management.Automation.Provider.Containercmdletprovider.Getchilditems* メソッドの実装では、メソッドに渡されるパスが指定された機能の要件を満たしていることを確認する必要があります。 これを行うには、メソッドが適切なプロパティ (System.Management.Automation.Provider.Cmdletprovider.Exclude* や System.Management.Automation.Provider.Cmdletprovider.Include* プロパティなど) にアクセスする必要があります。
System.Management.Automation.Provider.Containercmdletprovider.Renameitem*メソッドは、移動操作ではなく、項目の名前のみを変更することを目的としています。 パラメーターにパス区切り記号が含まれている場合、または項目が親の場所を変更する可能性がある場合は、メソッドの実装でエラーが書き
newName込まれる必要があります。既定では 、System.Management.Automation.Provider.Cmdletprovider.Force* プロパティが指定されていない限り、このメソッドのオーバーライドでオブジェクトの名前を変更する必要があります。 指定したパスがコンテナーを示す場合 、System.Management.Automation.Provider.Cmdletprovider.Force* プロパティは必要ありません。
System.Management.Automation.Provider.Containercmdletprovider.Renameitem*メソッドの実装では、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.Containercmdletprovider.Renameitem*メソッドはSystem.Management.Automation.Provider.Cmdletprovider.ShouldContinueメソッドを呼び出す必要があります。 このメソッドは、操作を継続する必要がある場合に追加のフィードバックを送信するために、ユーザーに確認メッセージをメッセージに送信します。 プロバイダーは、危険な可能性のあるシステム変更の追加チェックとして System.Management.Automation.Provider.Cmdletprovider.ShouldContinue を呼び出す必要があります。
動的パラメーターを 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* の実装には、次の条件が適用される場合があります。
System.Management.Automation.Provider.Containercmdletprovider.Newitem*メソッドでは、 パラメーターで渡された文字列の大文字と小文字を区別しない比較を実行する必要
typeがあります。 また、あいまいな一致を少なくとも許可する必要があります。 たとえば、型 "file" と "directory" の場合、あいまいさのためには最初の文字だけが必要です。 パラメーターがプロバイダーが作成できない型を示す場合type、System.Management.Automation.Provider.Containercmdletprovider.Newitem* メソッドは、プロバイダーが作成できる型を示すメッセージを含む ArgumentException を書き込む必要があります。パラメーターの場合、少なくとも文字列を受け入れるには
newItemValue、System.Management.Automation.Provider.Containercmdletprovider.Newitem* メソッドの実装をお勧めします。 また、同じパスに対して System.Management.Automation.Provider.Itemcmdletprovider.Getitem* メソッドによって取得されるオブジェクトの型も受け入れる必要があります。 System.Management.Automation.Provider.Containercmdletprovider.Newitem*メソッドでは、System.Management.Automation.Languageprimitives.Convertto*メソッドを使用して、型を目的の型に変換できます。System.Management.Automation.Provider.Containercmdletprovider.Newitem*メソッドの実装では、System.Management.Automation.Provider.Cmdletprovider.ShouldProcessを呼び出し、戻り値を確認してからデータ ストアに変更を加える必要があります。 Containercmdletprovider のSystem.Management.Automation.Provider.Cmdletprovider.ShouldProcess呼び出しによって true が返された後、Newitem * メソッドはを呼び出すSystem.Management.Automation.Provider.Containercmdletprovider.Newitem* 必要があります。この場合、* メソッドはSystem.Management.Automation.Provider.Cmdletprovider.ShouldContinueSystem.object は、危険性の高いシステム変更について追加のチェックとしてメソッドを続行します。
動的パラメーターを 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* の実装には、次の条件が適用される場合があります。
プロバイダー クラスを定義するときに、Windows PowerShell コンテナー プロバイダーは、System.Management.Automation.Provider.Providercapabilities列挙体から ExpandWildcards、Filter、Include、または Exclude のプロバイダー機能を宣言する場合があります。 このような場合 、System.Management.Automation.Provider.Containercmdletprovider.Getchilditems* メソッドの実装では、メソッドに渡されるパスが指定された機能の要件を満たしていることを確認する必要があります。 これを行うには、メソッドが適切なプロパティ (System.Management.Automation.Provider.Cmdletprovider.Exclude* や System.Management.Automation.Provider.Cmdletprovider.Include* プロパティなど) にアクセスする必要があります。
既定では 、System.Management.Automation.Provider.Cmdletprovider.Force* プロパティが true に設定されていない限り、このメソッドのオーバーライドによってオブジェクトが削除されません。 指定したパスがコンテナーを示す場合 、System.Management.Automation.Provider.Cmdletprovider.Force* プロパティは必要ありません。
System.Management.Automation.Provider.Containercmdletprovider.Removeitem*の実装は、循環リンクなどがある場合に無限再帰を防ぐ役割を担います。 このような条件を反映するには、適切な終了例外をスローする必要があります。
System.Management.Automation.Provider.Containercmdletprovider.Removeitem*メソッドの実装では、System.Management.Automation.Provider.Cmdletprovider.ShouldProcessを呼び出し、戻り値を確認してからデータ ストアに変更を加える必要があります。 System.Management.Automation.Provider.Cmdletprovider.ShouldProcessの呼び出しから が返された後
true、System.Management.Automation.Provider.Containercmdletprovider.Removeitem*メソッドは、危険な可能性のあるシステム変更の追加チェックとしてSystem.Management.Automation.Provider.Cmdletprovider.ShouldContinueメソッドを呼び出す必要があります。
動的パラメーターを 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*の実装には、次の条件が適用される場合があります。
- コンテナー プロバイダーが興味深いマウント ポイントを含むルートを公開する場合、パスに null または空の文字列が渡された場合、System.Management.Automation.Provider.Containercmdletprovider.Haschilditems*メソッドの実装は を返す必要があります。
true
項目のコピー
項目をコピーするには、コンテナー プロバイダーが 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の実装には、次の条件が適用される場合があります。
プロバイダー クラスを定義するときに、Windows PowerShell コンテナー プロバイダーは、System.Management.Automation.Provider.Providercapabilities列挙体から ExpandWildcards、Filter、Include、または Exclude のプロバイダー機能を宣言する場合があります。 このような場合 、System.Management.Automation.Provider.Containercmdletprovider.Getchilditems* メソッドの実装では、メソッドに渡されるパスが指定された機能の要件を満たしていることを確認する必要があります。 これを行うには、メソッドが適切なプロパティ (System.Management.Automation.Provider.Cmdletprovider.Exclude* や System.Management.Automation.Provider.Cmdletprovider.Include* プロパティなど) にアクセスする必要があります。
既定では 、System.Management.Automation.Provider.Cmdletprovider.Force* プロパティが に設定されていない限り、このメソッドのオーバーライドによって既存のオブジェクトにオブジェクトがコピーされません
true。 たとえば 、System.Management.Automation.Provider.Cmdletprovider.Force* プロパティが に設定されていない限り、FileSystem プロバイダーは既存の c:\abc.txt ファイルに c:\temp\abc.txt をコピーしますtrue。 パラメーターに指定されたパスが存在し、コンテナーを示す場合copyPath、System.Management.Automation.Provider.Cmdletprovider.Force* プロパティは必要ありません。 この場合 、System.Management.Automation.Provider.ContainerCmdletProvider.CopyItem は、パラメーターで示された項目を、子としてパラメーターによって示されるコンテナーにコピーするpathcopyPath必要があります。System.Management.Automation.Provider.ContainerCmdletProvider.CopyItemの実装は、循環リンクなどがある場合の無限再帰を防ぐ役割を担います。 このような条件を反映するには、適切な終了例外をスローする必要があります。
System.Management.Automation.Provider.ContainerCmdletProvider.CopyItemメソッドを実装する場合は、System.Management.Automation.Provider.Cmdletprovider.ShouldProcessを呼び出し、データ ストアに変更を加える前に戻り値を確認する必要があります。 ContainerCmdletProvider の呼び出しによって trueSystem.Management.Automation.Provider.Cmdletprovider.ShouldProcessが返された後に、このメソッドはを呼び出す必要System.Management.Automation.Provider.ContainerCmdletProvider.CopyItemがあります。この場合、このメソッドは、 System.Management.Automation.Provider.Cmdletprovider.ShouldContinueSystem.object は、危険性の高いシステム変更について追加のチェックとしてメソッドを続行します。 これらのメソッドの呼び出しの詳細については、「項目の名前変更」 を参照してください。
動的パラメーターを 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 データベースが使用されます。
コマンドレットを
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 :コマンドレットを
Get-ChildItem再度実行して、テーブルのデータを取得します。(Get-ChildItem mydb:customers).data次のような出力が表示されます。
TABLE_CAT : c:\PS\northwind TABLE_SCHEM : TABLE_NAME : Customers TABLE_TYPE : TABLE REMARKS :次に、
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再利用
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次に、 コマンドレット
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"次のように、新しい項目操作の正しさを確認します。
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実装
フィードバック
フィードバックの送信と表示