您可以使用 PowerShell 的原生方式:
"The condition is " + (&{If($Condition) {"True"} Else {"False"}}) + "."
但是由于这会在您的语法中添加很多括号和方括号,您可以考虑以下(可能是现有的最小的)CmdLet:
Function IIf($If, $Right, $Wrong) {If ($If) {$Right} Else {$Wrong}}
这会将您的命令简化为:
"The condition is " + (IIf $Condition "True" "False") + "."
于 2014 年 9 月 19 日添加:
我使用IIf cmdlet 已经有一段时间了,我仍然认为它在很多情况下会使语法更具可读性,但我同意 Jason 关于不想要的副作用的说明,即两个可能的值都会即使很明显只使用了一个值,我也对IIf cmdlet 进行了一些更改:
Function IIf($If, $IfTrue, $IfFalse) {
If ($If) {If ($IfTrue -is "ScriptBlock") {&$IfTrue} Else {$IfTrue}}
Else {If ($IfFalse -is "ScriptBlock") {&$IfFalse} Else {$IfFalse}}
}
现在您可能添加一个 ScriptBlock(由 {}'s 包围)而不是一个对象,如果不需要,则不会被评估,如本例所示:
IIf $a {1/$a} NaN
或内联放置:
"The multiplicative inverse of $a is $(IIf $a {1/$a} NaN)."
如果$a 的值不是零,则返回乘法逆;否则,它将返回 NaN(其中不评估 {1/$a})。
另一个很好的例子是,它可以让安静的模棱两可的语法变得更简单(尤其是在您想将其置于内联的情况下),您希望在可能是 $Null 的对象上运行方法。
执行此操作的原生“If”方式如下:
If ($Object) {$a = $Object.Method()} Else {$a = $null}
(请注意,Else 部分通常在需要重置 $a 的循环中是必需的。)
使用IIf cmdlet 将如下所示:
$a = IIf $Object {$Object.Method()}
(请注意,如果$Object 是$Null,如果没有提供$IfFalse 值,$a 将自动设置为$Null。)
于 2014 年 9 月 19 日添加:
对现在设置当前对象($_ 或 $PSItem)的 IIf cmdlet 进行细微更改:
Function IIf($If, $Then, $Else) {
If ($If -IsNot "Boolean") {$_ = $If}
If ($If) {If ($Then -is "ScriptBlock") {&$Then} Else {$Then}}
Else {If ($Else -is "ScriptBlock") {&$Else} Else {$Else}}
}
这意味着您可以使用可能是$Null 的对象上的方法来简化语句(PowerShell 方式)。
现在的通用语法为$a = IIf $Object {$_.Method()}。更常见的示例如下所示:
$VolatileEnvironment = Get-Item -ErrorAction SilentlyContinue "HKCU:\Volatile Environment"
$UserName = IIf $VolatileEnvironment {$_.GetValue("UserName")}
请注意,如果相关注册表 (HKCU:\Volatile Environment) 不存在,命令$VolatileEnvironment.GetValue("UserName") 通常会导致“您不能在空值表达式上调用方法。”错误;其中命令IIf $VolatileEnvironment {$_.GetValue("UserName")} 只会返回$Null。
如果$If 参数是条件(类似于$Number -lt 5)或强制条件(具有[Bool] 类型),则IIf cmdlet 不会覆盖当前对象,例如:
$RegistryKeys | ForEach {
$UserName = IIf ($Number -lt 5) {$_.GetValue("UserName")}
}
或者:
$RegistryKeys | ForEach {
$UserName = IIf [Bool]$VolatileEnvironment {$_.OtherMethod()}
}
添加于 2020 年 3 月 20 日:
Using the ternary operator syntax
PowerShell 7.0 引入了一种使用三元运算符的新语法。它遵循 C# 三元运算符语法:
三元运算符的行为类似于简化的if-else 语句。
计算<condition> 表达式并转换结果
到一个布尔值以确定接下来应该评估哪个分支:
如果<condition> 表达式为真,则执行<if-true> 表达式
如果<condition> 表达式为假,则执行<if-false> 表达式
示例:
"The multiplicative inverse of $a is $($a ? (& {1/$a}) : 'NaN')."