PowerShell 7 最近将Null-conditional ( ?.
) 运算符移出实验阶段。在玩弄它并阅读上面链接中的示例时,我想我理解它是如何工作的。在下面的示例中,provided$a
不是 null 并且有一个名为PropName
它的属性,它将返回值,$a.PropName
否则返回 null。:
$a = @{ PropName = 100 }
${a}?.PropName # ==> 100
但是,我不明白为什么我会使用新的空条件运算符而不是使用点 ( .
) 访问对象属性。下面的示例以两种方式呈现相同的内容,并且不会抛出或显式抑制任何错误:
点
@{ PropName = 100 },
@{ PropNumber = 8675309 } | Foreach-Object {
Write-Host ( $null -ne $_.PropName ? "PropName has a value of $($_.PropName)" : 'PropName is $null' )
}
# 1st iteration ==> PropName has a value of 100
# 2nd iteration ==> PropName is $null
空条件(注意细微的变化)
@{ PropName = 100 },
@{ PropNumber = 8675309 } | Foreach-Object {
Write-Host ( $null -ne ${_}?.PropName ? "PropName has a value of $(${_}?.PropName)" : 'PropName is $null' )
}
# 1st iteration ==> PropName has a value of 100
# 2nd iteration ==> PropName is $null
所以,我知道什么时候应该使用它,但是 PowerShell 已经有了一个语法更简单的解决方案。说白了,这个算子的意义何在?除了上面链接的内容之外,我找不到关于该运算符的太多文档,并且我假设一定有我遗漏的东西。数组 ( ) 有一个类似的运算符,?[]
可以有条件地返回数组元素,如果索引超出范围,则返回 $null,但同样,$null
如果您超出数组范围并尝试访问属性,PowerShell 已经返回且没有错误。