基于this回答,我尝试创建另一个重用那个三元运算符的别名(别名),执行命令时出错:
'&'之后的表达在管道元素中生成了一个无效的对象。它必须导致命令名称,脚本块或CommandInfo对象。
当返回来自三元运算符的值时,该行引发错误。我几乎坚持下去,我不明白为什么会这样。
代码:
Function Invoke-Ternary {
[CmdletBinding()]
Param(
[scriptblock]$Condition,
[scriptblock]$TrueBlock,
[scriptblock]$FalseBlock
)
Process {
if (&$Condition) {
return &$TrueBlock
}
return &$FalseBlock
}
}
Function Get-ValueOrDefault {
[CmdletBinding()]
Param(
[scriptblock]$Value,
[scriptblock]$DefaultValue
)
Process {
Invoke-Ternary $Value $Value $DefaultValue
}
}
Set-Alias ?: Invoke-Ternary -Description "PS ternary operator workaround"
Set-Alias ?? Invoke-Ternary -Description "PS default value operator workaround"
用法:
这很好用:
?: { $non_existing_variable } { $non_existing_variable } {'default'}
这会引发上述错误:
?? { $non_existing_variable } { 'default' }
答案 0 :(得分:1)
我最近改进了(打开PullRequest)PoweShell lib'Pscx'中的三元条件和零合并运算符 请看看我的解决方案。
我的github主题分支: UtilityModule_Invoke-Operators
Invoke-Ternary
Invoke-TernaryAsPipe
Invoke-NullCoalescing
NullCoalescingAsPipe
Set-Alias :?: Pscx\Invoke-Ternary -Description "PSCX alias"
Set-Alias ?: Pscx\Invoke-TernaryAsPipe -Description "PSCX alias"
Set-Alias :?? Pscx\Invoke-NullCoalescing -Description "PSCX alias"
Set-Alias ?? Pscx\Invoke-NullCoalescingAsPipe -Description "PSCX alias"
<condition_expression> |?: <true_expression> <false_expression>
<variable_expression> |?? <alternate_expression>
作为表达,你可以通过:
$ null,文字,变量,“外部”表达式($ b -eq 4)或scriptblock {$ b -eq 4}
如果变量表达式中的变量为$ null或不存在,则将替代表达式计算为输出。