PowerShell 7 中引入了哪些新的空運算子?


PowerShell 7 版本引入了一些新的空運算子。它們如下所示。

  • 空合併運算子 - ??

  • 空條件賦值運算子 - ??=

  • 空條件成員訪問運算子 - ?. 和 ?[]

a. 空合併運算子 - ??

空合併運算子 ?? 會評估左側條件或運算元,如果它是空值,則評估右側運算元;否則,提供左側運算元的值。

例如,如果沒有空合併運算子,我們將編寫如下所示的指令碼:

$Name = $null
if($Name -eq $null){"Name is Null"}
Else {"PowerShell"}

上面的相同條件可以用 ?? 運算子編寫。

$name = $null
$name ?? "PowerShell"

輸出:

PowerShell

因此,變數輸出的左側為空,因此評估右側的值或表示式。

假設左側運算元不為空,則將顯示其值。

$name = "Hello"
$name ?? "PowerShell"
Hello

您還可以新增表示式:

$service = Get-Service abc -ErrorAction Ignore
$service ?? (Get-Service Spooler)

輸出:

Status Name DisplayName
------ ---- -----------
Running Spooler Print Spooler

b. 空條件賦值運算子 - ??=

PowerShell 中的空條件賦值運算子 ??= 僅當左側運算元的值為空時,才將右側運算元的值賦給左側運算元。如果左側運算元為空,則此運算子不會評估右側運算元。例如:

$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…

如果左側運算子不為空,則值不會更改。

$val = "PowerShell"
$val ??= "Hello World"

輸出:

$val
PowerShell

c. 空條件成員訪問運算子 - ?. 和 ?[]

顧名思義,這兩個運算子都用於訪問物件的成員。這兩個運算子都在 PS 7 版本中引入,並且仍在預覽模式中,用於實驗目的,因此並非每個人都能使用。

它類似於直接訪問變數或物件的任何屬性或成員,但是為什麼我們需要它們呢?因為首先它會評估物件,如果它是空值,則它不會訪問成員(屬性或方法)。

由於我們使用這兩個運算子來訪問物件的屬性或方法,因此我們需要將物件用 {} 括號括起來,然後才能使用運算子。例如:

$service = Get-Service WinRm
${Service}?.Status

輸出:

Running

上面的示例也可以透過簡單地訪問屬性來實現,但區別在於,如果服務名稱不存在,則簡單的命令會丟擲錯誤,而如果服務名稱為空,則此運算子不會丟擲錯誤。例如:

$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()

更新於:2020年9月19日

178 次瀏覽

啟動您的職業生涯

透過完成課程獲得認證

開始
廣告
© . All rights reserved.