【发布时间】:2021-09-18 03:55:18
【问题描述】:
问题
如果使用管道或-InputObject 参数传递相同的PSObject,则调用Where-Object cmdlet 将返回不同的输出:
- 使用管道时,应用条件。
- 使用
-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-ChildItem 到Where-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
【问题讨论】:
-
在最后一个示例中,您要求
Where-Object一次将整个数组评估为一个单一的事物,而不是逐个评估项目。因为(Get-ChildItem).Name评估为一个集合,其中至少一项满足条件,整个数组过滤。 -
我认为这个 PowerShell 问题描述了这种不一致:
#4242Consistently document a scalar -InputObject parameter as an implementation detail or make item-by-item processing cmdlets explicitly iterate over collections from @mklement0
标签: powershell powershell-5.0 powershell-5.1