Más programnyelvekben létező tömör If – Then – Else szerkezet jelent meg újdonságként:
PS C:\> $true ? "Igaz" : "Hamis"
Igaz
PS C:\> $false ? "Igaz" : "Hamis"
Hamis
Elsősorban egyszerű értékadásoknál tartom ezt hasznosnak, mert ha akár cmdleteket szeretnénk végrehajtatni, akkor már zárójelezni kell és a kódunk olvashatósága is nehézkesebb lesz:
PS C:\> 5 -gt 3 ? (get-date) : (dir)
2020. március 31. 18:10:19
Nem csak értékek alapján lehet feltételesen végrehajtani utasításokat, hanem parancsok futásának eredménye alapján is:
PS C:\> Test-Path C:\Windows && Write-Host "Success"
True
Success
Ha az első parancs sikeresen végrehajtódik ($? eredménye $true, vagy a $LASTEXITCODE értéke 0), akkor a && utáni rész is végrehajtódik.
Ennek ellentettje, a || operátor, aminél pont akkor hajtódik végre a második kifejezés, amikor az első rész sikertelen:
PS C:\> remove-item C:\kakukk || Write-Host "Failure"
Remove-Item: Cannot find path 'C:\kakukk' because it does not exist.
Failure
Itt tehát igazából nem $true vagy $false eredmény alapján történik a végrehajtás, hanem a siker vagy sikertelenség alapján, azaz:
PS C:\> Test-Path C:\kakukk || Write-Host "Failure"
False
Ebben az esetben a Test-Path rész $false-t ad, mégsem hajtódik végre a Write-Host kifejezés, hiszen a Test-Path nem adott semmilyen hibát.
Szintén más programnyelvekből vették át a Null értékét helyettesítő operátort. Ha a ?? operátor bal oldalán Null van, akkor az eredmény a ?? jobb oldala lesz, egyébként marad a bal oldal:
PS C:\> $x = $null
PS C:\> $x ?? "Ez most Null volt"
Ez most Null volt
PS C:\> $x = 0
PS C:\> $x ?? "Null"
0
Látszik, hogy itt nincs olyasmi, mint a False szinonímái esetén. Itt csak a Null élesíti a jobb oldalt.
Ezzel az operátorral lehet felülírni egy változót, ha annak eredetileg Null volt az értéke:
PS C:\> $x = $null
PS C:\> $x ??= "Felülírom"
PS C:\> $x
Felülírom
PS C:\> $x = 1
PS C:\> $x ??= "Felülírom"
PS C:\> $x
1
A fenti példában elsőként $x-ben $null van, azután az feltételes értékadás után a „Felülírom” szöveg került. A második esetben nem történt értékadás, mert az $x eredetileg nem Null volt.
Megjegyzés:
Új funkció a PowerShell 7-ben, hogy bizonyos funkciók kísérleti jelleggel vannak csak benne, használatuk éles környezetben nem támogatott, de tesztelési jelleggel be lehet kapcsolni őket.
Lekérdezni ezeket a Get-ExperimentalFeature cmdlettel lehet, engedélyezni az Enable-ExperimentalFeature-el.
Tehát ez egy kísérleti funkció, a szintaktikája nekem nem is igazán tetszik, reméljük még faragnak rajta a végleges élesítésig.
Ezen kísérleti funkció bekapcsolásához a következő parancsot használhatjuk:
PS C:\> Enable-ExperimentalFeature -Name PSNullConditionalOperators
WARNING: Enabling and disabling experimental features do not take effect until next start of PowerShell.
A PowerShell 7 újraindítása után már elérhető lesz a következő funkció, de előbb nézzük az alapproblémát!
PS C:\> $file = get-item C:\Windows\notepad.exe
PS C:\> $file.gettype().fullname
System.IO.FileInfo
Itt ugye egy metódus eredményének egy tulajdonságára vagyok kíváncsi, de mi van, ha a $file-ba valami miatt Null van?
PS C:\> $file = $null
PS C:\> $file.gettype().fullname
InvalidOperation: You cannot call a method on a null-valued expression.
Hibát kapok, holott én értenék abból is, ha semmi lenne az eredmény. Ezt lehet a ?. operátorral elérni:
PS C:\> ${file}?.gettype().fullname
PS C:\>
A . elé tett ? sajnos nem elég, mert a változók nevében is lehetne ?, ezért sajnos a változó nevét kapcsos zárójelek közé kell tenni. Na ez nem tetszik! Mindenesetre az eredmény a szép semmi lett. Ezzel az operátorral tehát csak akkor hívja meg a metódust vagy kérdezi le a tulajdonságot, ha az objektum nem Null.