How do I create an a statement with an Inline If (IIf, see also: http://en.wikipedia.org/wiki/IIf or ternary If) in PowerShell?
If you also think that this should be a native PowerShell function, please vote this up: https://connect.microsoft.com/PowerShell/feedback/details/1497806/iif-statement-if-shorthand
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 follow (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:
Actually Powershell gives back values that haven't been assigned
Example:
Let's try it out:
Here is another way:
PowerShell doesn't have support for inline ifs. You'll have to create your own function (as another answer suggests), or combine if/else statements on a single line (as another answer also suggests).