【发布时间】:2021-02-28 12:36:21
【问题描述】:
我刚刚遇到了 Where-Object 的意外行为,我找不到任何解释:
$foo = $null | Where-Object {$false}
$foo -eq $null
> True
($null, 1 | Measure-Object).Count
> 1
($foo, 1 | Measure-Object).Count
> 1
($null, $null, 1 | Measure-Object).Count
> 1
($foo, $foo, 1 | Measure-Object).Count
> 0
如果Where-Object 的条件为假,则$foo 应该是$null(看起来是正确的)。
但是,在任何值进入管道之前至少管道 $foo 两次似乎会破坏它。
这是什么原因造成的?
其他不一致:
($foo, $null, 1 | Measure-Object).Count
> 1
($foo, $null, $foo, 1 | Measure-Object).Count
> 0
($null, $foo, $null, 1 | Measure-Object).Count
> 1
($foo, 1, $foo, $foo | Measure-Object).Count
> 1
($null, $foo, $null, $foo, 1 | Measure-Object).Count
> 0
【问题讨论】:
-
$foo不完全是$null,这可以通过检查$foo.psbase来验证(真正的$null不会为.psbase提供任何信息)。这是运行时用包装对象做一些奇怪的事情。 -
更清晰的可能是
$foo -is [psobject],对于... | Where-Object {$False}是$True,对于$null是$False。这是一个PSObject隐式转换为$null,但不是完全透明。 -
另见此 SO Q&A。 stackoverflow.com/questions/66396721/…
标签: powershell