选项-recurse有时对PowerShell cmdlet get-childitem不起作用

4
假设我有这个文件:
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。此外,该命令会运行很长时间,并在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中发生了变化。


已将此问题报告为错误,请参见此处。如果您认为应该修复此问题,请投票支持。 - herzbube
1个回答

3
我在Windows 7 x64位操作系统上使用PowerShell 4.0也得到了与你相同的结果。从外表看来,递归功能正在忽略-LiteralPath参数。
这是一个解决方法,我在TechNet文章中发现了一个讨论相同问题的帖子。那篇文章中,原帖作者最终使用了-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.

2
虽然丑陋无比,但它确实能解决问题。叹气 使用PowerShell时我需要注意的又一个hack :-( - herzbube
@herzbube 等一下。我还没有_真正_回答这个问题。仍然不知道你的问题的真正原因。比我更有经验的人可能知道发生了什么。 - Matt
好的,如果有更好的答案我会考虑的。但目前我会使用你提供的解决方案。这是一个构建脚本,在此失败,所以有点紧急。 - herzbube

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接