How do I create an a statement with an inline If (IIf, see also: Immediate if or ternary If) in PowerShell?
The Microsoft Connect is retired, but the good news is that support for a ternary operator in PowerShell (Core) language appears to be on its way
You can use the PowerShell’s native way:
But as this adds a lot of parenthesis and brackets to your syntax, you might consider the following (probably one of the smallest existing) CmdLet:
Which will simplify your command to:
Added 2014-09-19:
I have been using the
IIf
cmdlet now for a while, and I still think it will make syntaxes more readable in a lot of cases, but as I agree with Jason’s note about the unwanted side effect that both possible values will be evaluated even obviously only one value is used, I have changed theIIf
cmdlet a bit:Now you might add a ScriptBlock (surrounded by
{}
‘s) instead of an object which will not be evaluated if it is not required as shown in this example:Or placed inline:
In case
$a
has a value other than zero, the multiplicative inverse is returned; otherwise, it will returnNaN
(where the{1/$a}
is not evaluated).Another nice example where it will make a quiet ambiguous syntax a lot simpler (especially in case you want to place it inline) is where you want to run a method on an object which could potentially be
$Null
.The native ‘
If
’ way to do this, would be something like this:(Note that the
Else
part is often required in e.g. loops where you will need to reset$a
.)With the
IIf
cmdlet it will look like this:(Note that if the
$Object
is$Null
,$a
will automatically be set to$Null
if no$IfFalse
value is supplied.)Added 2014-09-19:
Minor change to the
IIf
cmdlet which now sets the current object ($_
or$PSItem
):This means you can simplify a statement (the PowerShell way) with a method on an object that could potentially be
$Null
.The general syntax for this will now be
$a = IIf $Object {$_.Method()}
. A more common example will look something like:Note that the command
$VolatileEnvironment.GetValue("UserName")
will normally result in an “You cannot call a method on a null-valued expression.” error if the concerned registry (HKCU:\Volatile Environment
) doesn’t exist; where the commandIIf $VolatileEnvironment {$_.GetValue("UserName")}
will just return$Null
.If the
$If
parameter is a condition (something like$Number -lt 5
) or forced to a condition (with the[Bool]
type), theIIf
cmdlet won’t overrule the current object, e.g.:Or:
Added 2020-03-20:
Using the ternary operator syntax
PowerShell 7.0 introduced a new syntax using the ternary operator. It follows the C# ternary operator syntax:
Example: