我刚刚碰到了一个意外的行为 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
的条件为false,$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
中没有任何内容)。这是运行时对包装对象进行奇怪处理的结果。 - Jeroen Mostert$foo -is [psobject]
,对于... | Where-Object {$False}
是$True
,对于$null
是$False
。它是一个PSObject
,可以隐式转换为$null
,但并不完全透明。 - Jeroen Mostert