2017-06-15 110 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