【问题标题】:Option -recurse sometimes does not work for PowerShell cmdlet get-childitem选项 -recurse 有时不适用于 PowerShell cmdlet get-childitem
【发布时间】:2015-08-24 12:51:43
【问题描述】:

假设我有这个文件:

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 版本中发生了变化。

【问题讨论】:

  • 将此报告为错误,see here。如果您认为应该解决此问题,请投票。

标签: powershell


【解决方案1】:

在使用 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.

【讨论】:

  • 虽然丑得要命,但它确实有效。 sigh 使用 PowerShell 时我需要注意的另一个技巧 :-(
  • @herzbube 等等。我还没有真的回答这个问题。仍然不知道您的问题的真正原因。比我更有经验的人可能知道发生了什么。
  • 是的,当然,如果有人有更好的答案,我会考虑,但目前我会采用您的解决方案。你知道,这是一个在这里失败的构建脚本,所以有一些紧迫性:-)
猜你喜欢
  • 2012-06-03
  • 1970-01-01
  • 2017-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-08
  • 1970-01-01
相关资源
最近更新 更多