假设我有这个文件:
C:\[foo]\bar
然后我运行这些PowerShell命令:
$path = 'C:\[foo]'
get-childitem -literalpath $path
一切正常,get-childitem
向我显示文件bar
,然后立即返回。
现在我添加-recurse
选项:
$path = 'C:\[foo]'
get-childitem -literalpath $path -recurse
get-childitem
不再显示文件bar
。此外,cmdlet运行时间很长,并为C:\Windows
下面的文件夹显示各种“权限被拒绝”错误消息,显然是因为它扫描整个C:驱动器。
问题与文件夹[bar]
在名称中包含括号的事实有关。如果我将文件夹重命名为bar
,即没有括号,则递归的结果将按预期工作。
我的主要问题:如何说服get-childitem
递归扫描名称中包含括号(或其他特殊字符)的文件夹?
第二个问题:这是一个已知的错误吗?
环境:Windows 8.1,PowerShell 4.0。
编辑:我在PowerShell 2.0(在Windows 7计算机上)验证了get-childitem
返回相同的结果,有或没有-recurse
。似乎行为在版本3.0或4.0中已更改。
答案 0 :(得分:3)
我使用PowerShell 4.0在Windows 7 x64位上获得与您相同的结果。从它的外观来看,递归功能忽略了-LiteralPath
。
这是一个解决方法,我发现TechNet post讨论了同样的问题。该帖子中的OP最终使用-Path
并双重转义括号。
$path = "C:\[foo]"
$escapedPath = $path.Replace("[","``[").Replace("]","``]")
Get-ChildItem -Path $escapedPath -Recurse
注意:如果您删除-Recurse
Get-ChildItem : Cannot find path 'C:\`[foo`]' because it does not exist.