据我所知,PowerShell似乎没有用于所谓三元运算符的内置表达式。
例如,在支持三元操作符的C语言中,我可以这样写:
<condition> ? <condition-is-true> : <condition-is-false>;
如果PowerShell中没有这样的功能,那么要达到同样的效果(即易于阅读和维护),最好的方法是什么?
据我所知,PowerShell似乎没有用于所谓三元运算符的内置表达式。
例如,在支持三元操作符的C语言中,我可以这样写:
<condition> ? <condition-is-true> : <condition-is-false>;
如果PowerShell中没有这样的功能,那么要达到同样的效果(即易于阅读和维护),最好的方法是什么?
当前回答
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的switch语句作为替代,特别是对于变量赋值-多行,但可读。
的例子,
$WinVer = switch ( Test-Path -Path "$Env:windir\SysWOW64" ) {
$true { "64-bit" }
$false { "32-bit" }
}
"This version of Windows is $WinVer"
我也在寻找一个更好的答案,虽然爱德华文章中的解决方案是“ok”,但我在这篇博客文章中提出了一个更自然的解决方案
简短而甜蜜:
# ---------------------------------------------------------------------------
# Name: Invoke-Assignment
# Alias: =
# Author: Garrett Serack (@FearTheCowboy)
# Desc: Enables expressions like the C# operators:
# Ternary:
# <condition> ? <trueresult> : <falseresult>
# e.g.
# status = (age > 50) ? "old" : "young";
# Null-Coalescing
# <value> ?? <value-if-value-is-null>
# e.g.
# name = GetName() ?? "No Name";
#
# Ternary Usage:
# $status == ($age > 50) ? "old" : "young"
#
# Null Coalescing Usage:
# $name = (get-name) ? "No Name"
# ---------------------------------------------------------------------------
# returns the evaluated value of the parameter passed in,
# executing it, if it is a scriptblock
function eval($item) {
if( $item -ne $null ) {
if( $item -is "ScriptBlock" ) {
return & $item
}
return $item
}
return $null
}
# an extended assignment function; implements logic for Ternarys and Null-Coalescing expressions
function Invoke-Assignment {
if( $args ) {
# ternary
if ($p = [array]::IndexOf($args,'?' )+1) {
if (eval($args[0])) {
return eval($args[$p])
}
return eval($args[([array]::IndexOf($args,':',$p))+1])
}
# null-coalescing
if ($p = ([array]::IndexOf($args,'??',$p)+1)) {
if ($result = eval($args[0])) {
return $result
}
return eval($args[$p])
}
# neither ternary or null-coalescing, just a value
return eval($args[0])
}
return $null
}
# alias the function to the equals sign (which doesn't impede the normal use of = )
set-alias = Invoke-Assignment -Option AllScope -Description "FearTheCowboy's Invoke-Assignment."
这样就可以很容易地做一些事情,比如(更多的例子在博客文章中):
$message == ($age > 50) ? "Old Man" :"Young Dude"
PowerShell目前没有一个本地内联If(或三元If),但你可以考虑使用自定义cmdlet:
IIf <condition> <condition-is-true> <condition-is-false>
参见:PowerShell内联If (IIf)
我能够想出的最接近PowerShell的构造是:
@({'condition is false'},{'condition is true'})[$condition]
根据这篇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})