gpt4 book ai didi

powershell - Get-ChildItem和不间断空格

转载 作者:行者123 更新时间:2023-12-03 08:50:00 25 4
gpt4 key购买 nike

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

简要地说,我在此文件夹上执行了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
. . .

我在服务器和客户端OS上使用PowerShell 4和5对其进行了测试,并且其行为相同。该名称也与 Get-Item命令有关,并且 -Path-LiteralPath开关的行为均相同。我也尝试了 [System.IO.Directory]类,但是它有同样的问题。

问题:我已经更新了脚本,以将此名称作为错误报告文件夹,并跳过了该文件夹,但我想知道是否还有其他更聪明的方法吗?我的目标是针对此类文件夹运行 Get-ChildItem或等效文件。

这是一个已知的问题?如果得到更多人的确认,是否值得将其报告为错误?

最佳答案

如评论中所述,您发现了一个实际的错误,希望该错误很快会得到解决。

但是,有一个非常可接受的解决方法,您可以在不排除文件夹的情况下继续使用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

关于powershell - Get-ChildItem和不间断空格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44567844/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com