PowerShell中两种$null行为差异及Compare-Object报错问题咨询
PowerShell中$null与经Select-Object处理的空对象行为差异
现象重现(PowerShell 5.1.19041.3031)
执行以下代码:
$x = $null 'x is null: {0}' -f ($null -eq $x) 'array containing x has size {0}' -f @($x).Count $y = $null | Select-Object 'y is null: {0}' -f ($null -eq $y) 'array containing y has size {0}' -f @($y).Count
输出结果:
x is null: True array containing x has size 1 y is null: True array containing y has size 0
可见$x和$y与$null比较都返回True,但数组包装后的长度完全不同,且两者都无法调用GetType()。
本质原因
$x = $null是真正的Null值:PowerShell的数组运算符@()会明确将纯Null包装为一个包含单个Null元素的数组,因此长度为1。$y = $null | Select-Object得到的是空PSObject:这是一个没有任何属性的特殊对象,PowerShell在进行数组包装时会将其视为"无有效内容",因此@($y)会生成空数组,长度为0。- 至于
$null -eq $y返回True,是因为PowerShell的比较逻辑会将空PSObject隐式判定为等同于Null,但两者本质类型完全不同。
实际问题解决
当执行$x = (Get-Bla).Name时,若Get-Bla无返回结果,$x会是纯Null,此时@($x)是包含Null的单元素数组,传给Compare-Object时会因Null元素导致报错。
而使用$x = (Get-Bla).Name | Select-Object时:
- 若
Get-Bla有返回,Select-Object会保留原属性值; - 若
Get-Bla无返回,会得到空PSObject,@($x)生成空数组,与空数组@()比较时Compare-Object能正常处理,不会报错。
内容的提问来源于stack exchange,提问作者Silex
相关产品推荐
相关产品推荐

