Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Powershell 获取子项和非中断空间_Powershell_Get Childitem - Fatal编程技术网

Powershell 获取子项和非中断空间

Powershell 获取子项和非中断空间,powershell,get-childitem,Powershell,Get Childitem,在处理文件服务器时,我注意到一个奇怪的文件夹破坏了我的脚本。文件夹的名称仅由一个ascii值为160(NBSP)的字符组成。从视觉上看,该名称与空格字符相同 简单地说,我已经在这个文件夹上执行了Get ChildItem,它正在进入无休止的循环。命令实际上是针对父文件夹执行的,它再次返回有问题的文件夹,所以我的脚本进入了无休止的循环 您可以在自己的环境中轻松模拟这一点。在C:\temp文件夹中,创建名称仅由NBSP组成的新文件夹。您可以通过按住alt键并按数字键盘上的0160键来输入。创建后,运

在处理文件服务器时,我注意到一个奇怪的文件夹破坏了我的脚本。文件夹的名称仅由一个ascii值为160(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
. . .
我在服务器和客户端操作系统上用PowerShell 4和5测试了这一点,其行为与此相同。命令
Get Item
也与此名称有问题,并且两个开关
-Path
-LiteralPath
的行为方式相同。我也尝试了
[System.IO.Directory]
类,但它也有同样的问题

问题:我已经更新了脚本,将具有此名称的文件夹报告为错误并跳过它,但我想知道是否有更聪明的方法来执行此操作?我的目标是对这样的文件夹运行
getchilditem
或等效程序


这是一个已知的问题吗?如果得到更多人的确认,是否值得将其作为一个bug报告到某个地方

如评论中所述,您发现了一个实际错误,有望很快得到修复

但是,有一个非常可接受的解决方法,您可以在继续使用Get ChildItem的同时,不需要排除文件夹,只需花费很少的努力就可以应用它

Get ChildItem的Unicode版本不存在此问题。 (在Windows 10环境下的Powershell 5.1上测试) 要使用它,只需更换

Get-ChildItem  -Path '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前缀约定:

奖金
unicode调用还可以解决260个字符的路径长度限制:

是的,我也看到了。肯定是个虫子
DirectoryInfo
对我有效:
([IO.DirectoryInfo]'c:\temp')。EnumerateFileSystemInfo('*','AllDirectories')
是的,好的旧目录也可以正常工作(不在高级控制台中,因为它只是gci的别名)查看堆栈上发生的递归,我认为这可以用任何.Net语言复制。@LievenKeersmaekers是对的。这不是一个PowerShell问题,而是一个dotnet问题。我在那里打开了一个问题。我会将你的解决方法作为答案发布,并提交一份bug报告。这肯定不是cmdlet的预期行为。
Get-ChildItem  -LiteralPath '\\?\UNC\127.0.0.1\c$\__tmp' -recurse