-1

基于这个答案,我尝试创建另一个重用该三元运算符的运算符(别名),并且在执行命令时出现错误:

管道元素中“&”之后的表达式产生了一个无效的对象。它必须产生一个命令名称、一个脚本块或一个 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' }
4

1 回答 1

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) 或脚本块 {$b -eq 4}

如果变量表达式中的变量为 $null 或不存在,替代表达式被评估为输出。

于 2018-06-11T15:29:34.363 回答