微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

-InputObject 参数和管道之间的 Where-Object 不一致行为 问题问题MWE

如何解决-InputObject 参数和管道之间的 Where-Object 不一致行为 问题问题MWE

问题

如果使用管道或 -InputObject 参数传递相同的 Where-Object,则调用 PSObject 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

解决方法

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

将对象通过管道传输到命令与使用命令的参数提交对象非常相似。

[...]

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。