Get-ChildItem和不间断的空间

时间:2017-06-15 12:43:04

标签: powershell get-childitem

在我的文件服务器上工作时,我注意到一个破坏我脚本的奇怪文件夹。文件夹的名称只包含一个ascii值为160(non-breaking space,NBSP)的字符。视觉上该名称与空格字符相同。

简单地说,我在此文件夹上执行了C:\temp,它正在进入无限循环。命令实际上是针对父文件夹执行的,它又返回有问题的文件夹,所以我的脚本进入无限循环。

您可以在自己的环境中轻松模拟此问题。在Get-ChildItem C:\Temp\ -Recurse 文件夹中,创建名称仅包含NBSP的新文件夹。您可以使用按住alt键并在数字键盘上按0160键入。创建后,运行

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
. . .

虽然我只有一个文件夹,但你会得到无名的文件夹列表。

Get-Item

我在PowerShell 4和5上对服务器和客户端操作系统进行了测试,结果与此相同。命令-Path也存在此名称问题,并且-LiteralPath[System.IO.Directory]交换机的行为方式相同。我也尝试了Get-ChildItem课程,但它遇到了同样的问题。

问题:我已更新我的脚本以报告此名称为错误的文件夹并跳过它,但我想知道是否有更聪明的方法可以做到这一点?我的目标是针对此类文件夹运行 Ignite ignite = Ignition.start("examples/config/example-ignite.xml") IgniteCache<Integer, String> cache=ignite.getOrCreateCache("myCache"); cache.put(1, "Hello"); cache.put(2, "World!"); 或等效文件。

这是一个已知问题吗?如果被更多人确认,那么值得将它报告为某个地方吗?

1 个答案:

答案 0 :(得分:1)

正如评论中所提到的那样,您发现了一个有望很快修复的实际错误。

但是,有一种非常可接受的解决方法,您可以轻松应用,同时继续使用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  -LiteralPath '\\?\UNC\127.0.0.1\c$\__tmp' -recurse 

请注意,我使用它来正常使用-LiteralPath参数而不是-Path

参考

来自Microsoft文档

-LiteralPath

指定一个或多个位置的路径。与-Path参数不同,-LiteralPath参数的值与键入的值完全相同。没有字符被解释为通配符。如果路径包含转义字符,请将其用单引号括起来。单引号告诉Windows PowerShell不要将任何字符解释为转义序列。

source

关于unicode前缀约定:Naming Files, Paths, and Namespaces

<强>加成 unicode调用还具有解决260个字符路径长度限制的好处:see here