在我的文件服务器上工作时,我注意到一个破坏我脚本的奇怪文件夹。文件夹的名称只包含一个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!");
或等效文件。
这是一个已知问题吗?如果被更多人确认,那么值得将它报告为某个地方吗?
答案 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不要将任何字符解释为转义序列。
关于unicode前缀约定:Naming Files, Paths, and Namespaces
<强>加成强> unicode调用还具有解决260个字符路径长度限制的好处:see here