【问题标题】:Where-Object inconsistent behaviour between -InputObject parameter and pipeWhere-Object -InputObject 参数和管道之间的行为不一致
【发布时间】:2021-09-18 03:55:18
【问题描述】:

问题

如果使用管道或-InputObject 参数传递相同的PSObject,则调用Where-Object cmdlet 将返回不同的输出:

  1. 使用管道时,应用条件。
  2. 使用-InputObject 参数时,会忽略该条件。

问题

为什么使用-InputObject参数时条件不适用?

MWE

考虑以下目录:

PS C:\> Get-ChildItem -Path "C:\tmp\mwe"


    Directory: C:\tmp\mwe


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----        07/07/2021     15:51              0 a.txt
-a----        07/07/2021     15:54              0 b.csv
-a----        07/07/2021     15:53              0 c.log

使用管道

当管道Get-ChildItemWhere-Object 时,条件正确应用,文本文件从输出中排除。

PS C:\> Get-ChildItem -Path "C:\tmp\mwe" | Where-Object -Property "Name" -NotMatch -Value "\.txt"


    Directory: C:\tmp\mwe


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----        07/07/2021     15:54              0 b.csv
-a----        07/07/2021     15:53              0 c.log

使用-InputObject参数

使用-InputObject 参数时,不应用条件且不从输出中排除文本文件。

PS C:\> Where-Object -InputObject (Get-ChildItem -Path "C:\tmp\mwe") -Property "Name" -NotMatch -Value "\.txt"


    Directory: C:\tmp\mwe


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----        07/07/2021     15:51              0 a.txt
-a----        07/07/2021     15:54              0 b.csv
-a----        07/07/2021     15:53              0 c.log

【问题讨论】:

标签: powershell powershell-5.0 powershell-5.1


【解决方案1】:

在仔细阅读pipeline documentation 之后,这种明显的行为确实是有意为之的。

将对象传递给命令很像使用命令的参数来提交对象。

[...]

但是,有一个重要的区别。当您通过管道将多个对象传递给一个命令时,PowerShell 一次将一个对象发送给该命令。当您使用命令参数时,对象将作为单个数组对象发送。这种微小的差异会产生重大影响。

感谢 Mathias R. JesseniRon 在 cmets 中指出这一点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-19
    • 2014-08-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多