选项-recurse有时不适用于PowerShell cmdlet get-childitem

时间:2015-08-24 12:51:44

标签: powershell

假设我有这个文件:

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中已更改。

1 个答案:

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