In addition to pipeline chain operators which i discussed in my previous post. PowerShell 7 introduces another long awaited addition, a ternary operator. This operator can be used in place of conditional statements If and Else. The ternary operator follows the format of the C# language and takes three arguments.
<condition> ? <if-true> : <if-false>
Using a ternary operator can be seen as a shorthand way of writing an if-else statement in PowerShell.
if <condition> {
do something
}
else
{
do something else
}
Ternary operators are an interesting addition to PowerShell 7. It’s basically a simplified if-else statement that you can perform on one line. The first argument is the condition to evaluate. The second argument is a True evaluation response, and the third is a False evaluation response.
$total = 10 * 5 -eq 20 ? 'yes' : 'no'
$os = $IsWindows ? 'This is a Windows OS' : 'Not a Windows OS'
$ConfirmPreference -ne High ? ($ConfirmPreference = High) : 'Already High'
(Test-Path $PROFILE) ? (Write-output 'Profile exists') : (New-Item -ItemType file -Path $PROFILE -Force)
The condition argument will get evaluated to a Boolean True / False which will determine which part of the branch is evaluated and run. If you want to run commands you’ll need to wrap them in parenthesis.
Nesting is possible using a ternary operator. Nesting ternary operators should be kept simple. At first glance it can be seen a little cryptic. But once you understand how it works it starts to make sense.
$IsMacOS ? 'You are on a Mac' : $IsLinux ? 'You are on Linux' : 'You must be on Windows'
If we write the above out in the traditional elseif way it starts to make more sense.
if ($IsMacOS) {
'You are on a Mac'
} elseif ($IsLinux) {
'You are on Linux'
} else {
'You must be on Windows'
}
If you have used the Where-Object alias in the past you will know that it’s referenced as a ‘?‘. Under very rare situations should you find yourself having a conflict or undesirable behavior between the ternery ‘?’ and Where-Object alias ‘?’. What will be more important is being able to correctly identify code referencing a ternary ‘?’ vs a Where-Object alias.
Ternary operators in PowerShell aren’t without a little controversy. It’s been a feature that has been requested for many years. Jeffery Snover spoke about wanting them way back in PowerShell v1. PowerShell, though, has had the ability to perform something very similar on one line for some time.
# Pre ternary way
$var = if ($x) { $y } else { $z }
# Ternary way
$var = $x ? $y : $z
It’s arguable which format is easier to understand. The traditional PowerShell way or the new ternary way??? While PowerShell users may find the former easier, programmers coming from languages like C# will no doubt be comfortable with using ternary operators in PowerShell. In any case I’d expect this to be a very niche operator rarely used, but time will tell I guess.
References
Ternary Operator RFC
1 thought on “PowerShell 7 – Ternary Operator”