2016-05-30 63 views
2

我正在編寫用C#編寫的PowerShell提供程序。該提供程序公開了一個對象樹,其名稱是任意的Unicode字符串,可以包含像",'等字符。如何轉義由PowerShell提供程序返回的路徑名稱

我想了解如何正確地返回這些名稱,但一直未能找到任何文件如何這樣做。

  1. PowerShell路徑如何轉義和顯示?
  2. 路徑或路徑段是否存在長度限制?
  3. 是否有語法或正則表達式來驗證PowerShell路徑或路徑段?
  4. 兩個項目具有相同的名稱(因此具有相同的路徑)是否合法?我的情況就是這種情況,名稱不必是唯一的。 (有獨特的性能例如,ID,​​但名稱不是唯一的。)
+1

爲了防止文檔是[here](https://msdn.microsoft.com/en-us/library/ee126186(v = vs.85) .aspx) 1)希望Path轉義只是關於你如何輸入字符串。如果不是,我認爲你必須在你的提供者中處理這個。 2)我不認爲提供商框架顯式限制路徑。 4)你的提供者將不得不瞭解如何處理這個問題。如果有兩件物品,你將如何處理獲得物品? – TravisEz13

+0

@TravisPlunk,約4),因爲它們是對象,它們可以通過程序來保存和過濾。它們確實具有獨特性,但其獨特性不僅僅在於名稱。例如,許多電子郵件可以具有相同的標題,但具有不同的潛在唯一ID。電子郵件標題似乎自然映射到PowerShell名稱。我只想確定這是PowerShell中可以接受的事情。 – bright

+0

@TravisPlunk,考慮重寫您的評論作爲答案。關於1)我沒有在您提供的鏈接中找到關於轉義路徑分隔符的任何信息。我錯過了什麼? – bright

回答

1

讓我們來看看在文件系統中的示例: PS> dir foo* Directory: C:\Users\jimtru\AppData\Local\Temp Mode LastWriteTime Length Name ---- ------------- ------ ---- -a---- 6/1/2016 11:11 AM 11 foo[bar].'baz' -a---- 6/1/2016 11:13 AM 8 foo[bar].`baz` 首先要注意的是有引號(單和回),它只是呈現,指示輸出擒沒有額外的字符,但是,這些可能導致PowerShell的有點燒心,如果你只是試圖讓自己的內容:

PS> get-content foo[bar].'baz' get-content : An object at the specified path foo[bar].baz... PS> get-content foo[bar].`baz`... get-content : An object at the specified path foo[bar]az`

有一對夫婦的方式圍繞這個。我們爲某些cmdlet提供-LiteralPath PS> get-content -LiteralPath "foo[bar].'baz'" sdflkj

請注意,我已在字符串周圍包含雙引號。這是因爲單引號將被視爲字符串元素,所以'foo'將被foo替代,雙引號表示解析器應該查看整個字符串(雙引號至雙引號)。另一種方式是使用轉義字符(反引號)。 PS> get-content 'foo`[bar`].`baz`' sdflkj

至於相同的路徑,我建議你避免這種情況。你需要一些方法來消除另一個實體的歧義。您應該確保您創建的路徑對您的資源是唯一的。請記住,您在提供商中構建了此路徑,因此您可以將提供消除歧義的功能添加爲提供商的一部分。

最後,長度上的限制可以表示爲文件系統上的路徑。 AFIK對非路徑「路徑」沒有限制

+0

謝謝。路徑中的路徑分隔符(即/或\)如何?原文是關於任意unicode路徑的,因此需要知道應由供應商,cmdlet或腳本專門處理的字符集。 – bright

相關問題