据我所知,PowerShell似乎没有用于所谓三元运算符的内置表达式。

例如,在支持三元操作符的C语言中,我可以这样写:

<condition> ? <condition-is-true> : <condition-is-false>;

如果PowerShell中没有这样的功能,那么要达到同样的效果(即易于阅读和维护),最好的方法是什么?


当前回答

因为我已经用过很多次了,没有看到它列在这里,我将添加我的部分:

$var = @{$true="this is true";$false="this is false"}[1 -eq 1]

最丑的!

有点源

其他回答

因为我已经用过很多次了,没有看到它列在这里,我将添加我的部分:

$var = @{$true="this is true";$false="this is false"}[1 -eq 1]

最丑的!

有点源

尝试powershell的switch语句作为替代,特别是对于变量赋值-多行,但可读。

的例子,

$WinVer = switch ( Test-Path -Path "$Env:windir\SysWOW64" ) {
  $true    { "64-bit" }
  $false   { "32-bit" }
}
"This version of Windows is $WinVer"

如果你只是在寻找一种语法上简单的方法来基于布尔条件赋值/返回一个字符串或数字,你可以使用这样的乘法运算符:

"Condition is "+("true"*$condition)+("false"*!$condition)
(12.34*$condition)+(56.78*!$condition)

如果你只对正确的结果感兴趣,你可以完全忽略错误的部分(反之亦然),例如一个简单的评分系统:

$isTall = $true
$isDark = $false
$isHandsome = $true

$score = (2*$isTall)+(4*$isDark)+(10*$isHandsome)
"Score = $score"
# or
# "Score = $((2*$isTall)+(4*$isDark)+(10*$isHandsome))"

注意,布尔值不应该是乘法运算中的前项,即$condition*"true"等将不起作用。

PowerShell中的三元运算符是在PowerShell version7.0中引入的。

[Condition] ? (output if True) : (output if False)

例01

$a = 5; $b = 6
($a -gt $b) ? "True" : "False"

输出

False

例子02

($a -gt $b) ? ("$a is greater than $b") : ("$a is less than $b")

输出

5 is less than 6

更多的信息 https://www.tutorialspoint.com/how-ternary-operator-in-powershell-works

根据这篇PowerShell博客文章,你可以创建一个别名来定义?:operator:

set-alias ?: Invoke-Ternary -Option AllScope -Description "PSCX filter alias"
filter Invoke-Ternary ([scriptblock]$decider, [scriptblock]$ifTrue, [scriptblock]$ifFalse) 
{
   if (&$decider) { 
      &$ifTrue
   } else { 
      &$ifFalse 
   }
}

像这样使用它:

$total = ($quantity * $price ) * (?:  {$quantity -le 10} {.9} {.75})