2014-02-24 34 views
0

我試圖模仿我的自定義項目文件作爲新的PS驅動器。我正在嘗試創建自NavigationCmdletProvider派生的自定義Powershell Provider。我已經重寫了PSDriveInfo來讀取幷包含來自文件的項目,並且文件路徑位於PSDriveInfo的根目錄中。Powershell提供程序 - GetItem路徑錯誤 - 自定義文件作爲驅動器

我無法正確覆蓋GetItem。我想要做的是使用GetNamesFromPath(path, out tableName, out rowNumber)方法。由於我的自定義項目基本上是數據集,我想使用tableName來獲取DataRow的ID的DataTable和rowNumber。

問題是我得到「路徑不存在」類錯誤。它不會進入重寫的方法。我錯過了什麼可以重寫嗎?文件路徑並不存在,但我只需要處理路徑並使用WriteItemObject和我想要的對象返回,而不檢查它是否是有效的路徑。

編輯1: 我注意到的一件事是它永遠不會進入GetItem,因此進入IsValidPath。當我調試和使用斷點時,首先我加載驅動器,然後將Set-Location加載到驅動器,調用IsItemContainer(必須重寫Set-Location才能工作)。

GetItemIsValidPath根本不會被調用,就好像它在調用覆蓋方法之前檢查有效路徑一樣。 NavigationCmdletProvider可以使用不存在的路徑(文件本身除外),只能使用手動處理路徑的字符串?

回答

1

確保您覆蓋IsValidPathItemExists方法:

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

protected override bool ItemExists(string path) 
{ 
    return true; 
} 
+0

我懷疑這件事很簡單,我錯過了。但它並沒有解決問題。我重寫了'IsValidPath'方法總是返回true並且改變'GetItem'總是返回同一個表,只是爲了看看它是否工作。仍然是同樣的錯誤「Get-Item:無法找到路徑'MyDrive:\ myName',因爲它不存在。」 我注意到的一件事是它永遠不會進入'GetItem',因此進入'IsValidPath'。當我調試和使用斷點時,首先加載驅動器,然後將'Set-Location'加載到驅動器,調用IsItemContainer'。不調用「GetItem」和/或「IsValidPath」。 –

+0

我經歷了一段時間以前寫過的提供程序,試着重寫'ItemExists'。 –

+0

是的,它沒有被正確覆蓋,只在某些情況下工作。我應該看到,但我受夠了。 Thx –

1

如果要擴展NavigationCmdletProvider那麼你應該重寫取決於你想爲支持哪些功能IsValidPathItemExistsGetItemGetChildItems和其他可能的方法你的PS硬盤。

找出哪些方法缺少實現的最好方法是覆蓋所有虛擬方法並在每個方法中放置一個斷點。然後執行一個cmdlet並在調試器中查看調用的內容和參數值。

不幸的是,關於實現自定義PowerShell提供程序的詳細文檔並不多。但是,您可以在MSDN上找到關於此主題的非常詳細的教程,其中包含許多源代碼示例。此外,您可以看看PowerShell VFS項目 - 它是PowerShell提供程序API的包裝,使構建複雜提供程序變得更容易。

+0

好吧,不要像你所說的一步一步地走,我想我需要聽取別人的意見才能真正做到這一點。終於,我現在正在取得一些進展。謝謝。 –

相關問題