PowerShell三元和默认运算符

时间:2018-01-25 11:25:34

标签: powershell ternary-operator conditional-operator scriptblock

基于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' }

1 个答案:

答案 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或不存在,则将替代表达式计算为输出。