2017-06-15 32 views
30

在我的文件服務器上工作時,我注意到一個奇怪的文件夾打破了我的腳本。文件夾的名稱只包含一個字符,其ASCII值爲160(non-breaking space,NBSP)。在視覺上這個名字與空格字符相同。Get-ChildItem和non-breaking space

簡而言之,我在此文件夾上執行了Get-ChildItem,並且它正在進入無限循環。命令實際上是針對父文件夾執行的,它會再次返回有問題的文件夾,所以我的腳本進入了無限循環。

你可以很容易地在你自己的環境中模擬這個。在C:\temp文件夾中創建名稱僅由NBSP組成的新文件夾。您可以按住alt並在數字鍵盤上按0160鍵入。創建後,運行

Get-ChildItem C:\Temp\ -Recurse 

您將得到無盡名單的文件夾沒有名稱,雖然我只有一個文件夾。

d-----  6/15/2017 2:20 PM 
d-----  6/15/2017 2:20 PM 
d-----  6/15/2017 2:20 PM 
d-----  6/15/2017 2:20 PM 
d-----  6/15/2017 2:20 PM 
. . . 

我使用PowerShell 4和5在服務器和客戶端操作系統上對其進行了測試,其行爲與此相同。命令Get-Item也有這個名稱的問題,並且兩個交換機-Path-LiteralPath的行爲方式都是相同的。我也試過[System.IO.Directory]類,但它有同樣的問題。

問題:我已更新我的腳本以報告具有此名稱的文件夾作爲錯誤並跳過它,但我想知道是否有一些更智能的方法來做到這一點?我的目標是運行Get-ChildItem或對等文件夾。

這是一個已知的問題?如果被更多人確認,那麼值得將它作爲錯誤報告嗎?

+6

是的,我看到它太。絕對是一個錯誤。 'DirectoryInfo'適用於我:'([IO.DirectoryInfo]'c:\ temp')。EnumerateFileSystemInfos('*','AllDirectories')' – wOxxOm

+0

我也可以證實這一點,毫無疑問這是可以利用的。我會鼓勵你報告。 –

+0

@wOxxOm你是否仍然可以緩存到該NBSP文件夾,如果它包含另一個文件夾?另外,你可以從字面上得到關於NBSP文件夾的dirinfo,而不僅僅是「temp」? – Vesper

回答

0

正如在評論中提到的那樣,您發現了一個實際的錯誤,希望能很快得到解決。

雖然有一個非常可接受的解決方法,您可以在不需要排除文件夾的情況下繼續使用Get-ChildItem的同時以最小的努力進行應用。

Get-ChildItem的Unicode版本不會遇到這個問題。 (在Windows 10環境下測試在PowerShell的5.1)要使用它,只需更換

Get-ChildItem -Path 'c:\__tmp' -recurse 

通過

Get-ChildItem -LiteralPath '\\?\c:\__tmp' -recurse 

附加說明

如果您需要處理UNC, UNC unicode調用稍有不同。

Get-ChildItem -LitteralPath '\\?\UNC\127.0.0.1\c$\__tmp' -recurse 

請注意,我用這個正常工作的-LiteralPath參數,而不是-path

參考

從微軟的文檔

-LiteralPath

指定一個或多個位置的路徑。與-Path參數不同,-LiteralPath參數的值完全按照鍵入的方式使用。沒有字符被解釋爲通配符。如果路徑包含轉義字符,請將其用單引號括起來。單引號會告訴Windows PowerShell不要將任何字符解釋爲轉義序列。

source

關於統一前綴約定:Naming Files, Paths, and Namespaces

獎金 Unicode的電話也解決了260個字符的路徑長度極限的好處:see here