PowerShell版本7引入了一些新的空运算符。它们如下。
空合并运算符-??
空条件赋值运算符-?? =
空条件成员访问运算符-?。和?[]
一种。空合并运算符-??
Null合并运算符将评估左侧条件或操作数,如果为null,则评估右侧操作数,否则将提供左侧操作数的值。
例如,如果没有Null-Coalescing运算符,我们将编写如下所示的脚本,
$Name = $null if($Name -eq $null){"Name is Null"} Else {"PowerShell"}
上面相同的条件可以写成?? 运算符。
$name = $null $name ?? "PowerShell"
输出-
PowerShell
因此,变量输出的左侧为Null,因此将评估值或表达式的右侧。
假设左侧操作数不为null,则显示其值。
$name = "Hello" $name ?? "PowerShell" Hello
您还可以添加表达式
$service = Get-Service abc -ErrorAction Ignore $service ?? (Get-Service Spooler)
输出-
Status Name DisplayName ------ ---- ----------- Running Spooler Print Spooler
b。空条件赋值运算符-?? =
Null条件赋值运算符?? =仅在左侧操作数值为null时,才将右侧操作数的值分配给左侧操作数。如果左侧操作数为Null,则此运算符不评估右侧操作数。例如,
$serivce = $null $service ??= (Get-Service Winrm)
输出-
$service Status Name DisplayName ------ ---- ----------- Running Winrm Windows Remote Management (WS-Managem…
上面的命令类似于,
$service = $null if($service -eq $null){$service = Get-Service Winrm} $service Status Name DisplayName ------ ---- ----------- Running Winrm Windows Remote Management (WS-Managem…
如果左侧运算符不为null,则不会更改该值。
$val = "PowerShell" $val ??= "Hello World"
输出-
$val PowerShell
C。空条件成员访问运算符-?。和?[]
顾名思义,这两个运算符都用于访问对象的成员。这两个运算符都是在PS版本7中引入的,并且仍处于“预览”模式,并且用于实验目的,因此并非所有人都可以使用。
这类似于直接访问变量或对象的任何属性或成员,但是为什么我们需要它们呢?因为它首先评估对象,并且如果它为null,则它不访问成员(属性或方法)。
由于我们同时使用两个运算符来访问对象的属性或方法,因此需要将对象用{}括起来,然后才能使用该运算符。例如,
$service = Get-Service WinRm ${Service}?.Status
输出-
Running
上面的示例也可以通过简单地访问属性来实现,但是不同之处在于,如果服务名称不存在,那么简单的命令将引发错误,如果服务名称为null,则该运算符将不存在。例如,
$services = Get-Service ABC -ErrorAction ignore $service.start() You cannot call a method on a null-valued expression. At line:1 char:1 + $service.start() + ~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidOperation: (:) [], RuntimeException + FullyQualifiedErrorId : InvokeMethodOnNull
新的运算符不会提供任何输出,因为服务名称不存在。
${Service}?.Start()