0

カスタム プロジェクト ファイルを新しい PS ドライブとしてエミュレートしようとしています。NavigationCmdletProviderから派生したカスタムPowershell プロバイダーを作成しようとしています。ファイルからプロジェクトを読み取って含めるように PSDriveInfo をオーバーライドしました。ファイルパスは PSDriveInfo のルートにあります。

GetItem を適切にオーバーライドできません。私がやりたいのは、GetNamesFromPath(path, out tableName, out rowNumber)メソッドを使用することです。私のカスタム プロジェクトは基本的にデータセットであるため、tableName を使用して DataTable を取得し、DataRow の ID として rowNumber を取得したいと考えています。

問題は、「パスが存在しません」という種類のエラーが発生することです。オーバーライドされたメソッドに入ることはありません。オーバーライドするものがありませんか? ファイルパスは実際には存在しませんが、パスを処理し、有効なパスであるかどうかを確認せずに、返されたオブジェクトとして必要なもので WriteItemObject を使用するだけです。

編集 1: 私が気づいたことの 1 つは、GetItemそれがIsValidPath. ブレークポイントをデバッグして使用するときは、最初にドライブをロードしてSet-LocationからドライブIsItemContainerを呼び出します (動作させるにはオーバーライドする必要がありますSet-Location)。

GetItemIsValidPathオーバーライドされたメソッドを呼び出す前に有効なパスをチェックするかのように、まったく呼び出されません。存在しないパス (ファイル自体を除く) を処理できNavigationCmdletProviderますか?パスと同じように手動で処理される文字列のみを処理できますか?

4

2 に答える 2

1

IsValidPathおよびItemExistsメソッド をオーバーライドしていることを確認してください。

protected override bool IsValidPath(string path)
{
    return true;
}

protected override bool ItemExists(string path)
{
  return true;
}
于 2014-02-24T02:09:27.543 に答える
1

拡張している場合は、 PS ドライブでサポートする機能に応じて、 IsValidPath 、 ItemExists 、 GetItem 、 GetChildItems 、およびその他のメソッドオーバーライドする必要ありますNavigationCmdletProvider

実装されていないメソッドを見つける最善の方法は、すべての仮想メソッドをオーバーライドし、それぞれにブレークポイントを設定することです。次に、コマンドレットを実行し、デバッガーで何が呼び出され、パラメーター値が何であるかを確認します。

残念ながら、カスタム PowerShell プロバイダーの実装に関する詳細なドキュメントはあまりありません。ただし、 MSDNには、このトピックに関する非常に詳細なチュートリアルがあり、多くのソース コードの例が示されています。さらに、PowerShell VFSプロジェクトを参照してください。これは、PowerShell プロバイダー API のラッパーであり、複雑なプロバイダーの構築を容易にします。

于 2014-02-25T09:30:54.930 に答える