【问题标题】:Powershell 5 Get-ChildItem LiteralPath doesn't work with Include anymorePowershell 5 Get-ChildItem LiteralPath 不再与 Include 一起使用
【发布时间】:2016-02-14 12:41:56
【问题描述】:

现在我使用 PowerShell 5.0.10586.0 更新到 Windows 10 TH2 Build 10586

现在我遇到了 Get-ChildItem 的问题

$files = Get-ChildItem -LiteralPath $path -Force -Recurse -Include *.txt

这将返回 $path 中的所有文件,即使它们不是 .txt。 这在更新之前有效。 当我将其更改为

$files = Get-ChildItem -Path $path -Force -Recurse -Include *.txt

它再次工作。但这不是我想要的。 这是一个错误还是我做错了什么?

【问题讨论】:

  • 里面的$path是什么,最后有\吗?
  • 我都测试过。最后有和没有\。没有任何区别。
  • 该错误仍然会影响 Windows PowerShell,但幸运的是已在(至少)v7.0 版本的 PowerShell(核心)中得到修复。然而,在没有 -Recurse 的情况下仍然存在有问题的设计行为:-Include-Exclude 仅适用于 input 路径,不适用于它们的 children;解决方法是使用Get-ChildItem * -Include ... / -Exclude ... - 请参阅this answer

标签: powershell powershell-5.0


【解决方案1】:

就个人而言,我从不不再使用-Include-Exclude。我总是通过Where-Object 进行管道传输。我不知道-Include-Exclude 的作者是不是疯了,或者底层的.Net 提供程序是否存在问题,但它们非常脆弱。

我在 5.0.10240.16384。

gci -Path $path -Include *.txt -Force

什么都不返回。

gci -LiteralPath $path -Include *.txt -Force

返回$path 中的所有内容。

gci -LiteralPath $path -Include *.txt -Force -Recurse
gci -Path $path -Include *.txt -Force -Recurse

$path 和所有子文件夹中都返回 *.txt。

那么正确的行为应该是什么? -Recurse 标志是否会修改 -Include 的工作方式?我不知道。我不再关心了。我不会处理这种行为。我只是用这个:

gci -Path $path -Recurse -Force | Where-Object { $_.Extension -eq '.txt' }

我依靠Get-ChildItem 来枚举文件和文件夹就是这样。只要给我对象,我就会过滤它们。就像所有旧的 Remove-Item -Recurse 错误一样,那里有些东西并没有按照人们期望的方式工作。

【讨论】:

  • @MarcFauser 嗯,你是对的。 The doc 还说 -Include 修改了 -Path 参数,并且对 -LiteralPath 参数一无所知。天哪,为什么这个 cmdlet 不会针对不受支持的语法发出错误?而且我不知道如何理解示例 3,它明确谈到了使用 -Path-Include 而不使用 -Recurse!我又一次问:“正确的行为应该是什么?”我可能会在 Microsoft Connect 上发帖,因为它会带来好处。
  • @BaconBits 可能知道这 2 年了,但是对于访问答案的人来说,cmdlet 不知道不受支持的语法 - 它只是将它们传递给 PS Provider 子系统 - 通配符行为文件系统 PS Provider 不同于注册表提供程序和 ActiveDirectory 提供程序等。我怀疑这也是它“像地狱一样脆弱”的原因——因为文件系统通配符向后兼容 Windows 3 或 MS-DOS 时代。这也是为什么文档不能说太多但“限定路径”的原因,因为它取决于 PSProvider 实现。
【解决方案2】:

【讨论】:

    【解决方案3】:

    注意-Filter 似乎没有这个问题。这有效:

    $files = Get-ChildItem -LiteralPath $path -Force -Recurse -Filter *.txt
    

    Filter 也是 more efficient,因为它由底层提供程序使用(与 PowerShell 本身应用的 Include 不同,很像您的代码添加的 where 子句)。

    但是Filter only accepts one pattern parameter, whereas Include supports multiple patterns.

    【讨论】:

    • 不幸的是 -Filter 只能处理一个过滤器,不能处理多个包含
    猜你喜欢
    • 2019-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多