【问题标题】:Why isn't the Ternary Operator in Powershell assigning my value?为什么 Powershell 中的三元运算符不分配我的值?
【发布时间】:2023-03-13 05:40:02
【问题描述】:

所以我有以下 powershell 脚本...使用 ternary operator of Powershell 我开始怀疑它的功能:

PS> $dasName="vCs01"

PS> $specialSubDerr @{
    "VCS01"="Derr";
    "VSC02"="dir";
    }

PS> $subDerr = @({"default"},{"$($specialSubDerr[$dasName.ToUpper()])"})[$specialSubDerr.contains($dasName.ToUpper())]
PS> $subDerr
"$($specialSubDerr[$dasName])"

PS> $($specialSubDerr[$dasName.ToUpper()])
Derr

那么在执行的最后两行,为什么没有赋值给$subDerr

【问题讨论】:

    标签: powershell conditional-operator


    【解决方案1】:

    使用Powershell的三元运算符

    您的代码确实使用PowerShell的三元运算符,该运算符仅在v7.0+中可用;相反,它使用 次优仿真,将 2 元素数组与条件相结合,其布尔结果映射到数组索引 0(对于 $false)或 1(对于 $true) .
    除了在概念上不明显之外,解决方法不是最理想的,因为它不会短路替代方案的评估;也就是说,数组的两个元素在被选择之前无条件评估。

    注意:

    • 不要将 @(...) 用于数组字面量 - 这不仅没有必要,而且在 PowerShell 5.0 以下版本中效率低下,而且更重要的是,它会引起概念上的混淆错误地暗示它 构造 数组 - 请参阅 this answer 的底部。

    • 不要将$(...) 用于单个命令或表达式除了可扩展字符串中("...")和/或者如果您需要在另一个语句中嵌入多个语句。

    • PowerShell 默认不区分大小写,因此没有需要使用.ToUpper()

    • {...} 定义了一个script block,这是一个可重复使用的 PowerShell 代码,您可以在稍后按需执行>,通常通过&call operator;脚本块本身打印作为它的字符串化值,它是开头{和结尾}之间的文字内容 ; 如果您想输出,请不要按原样使用脚本块。


    PowerShell [Core] 7.0+ 中,您可以使用 null-coalescing 运算符 ?? 来获得您想要的:

    $subDerr = $specialSubDerr[$dasName] ?? 'default'
    

    注意:严格来说,如果带有键 $dasName 的条目存在,上面也选择了'default',但碰巧有值$null.

    或者,使用三元条件

    $subDerr = $specialSubDerr.Contains($dasName) ? $specialSubDerr[$dasName] : 'default'
    

    早期版本中,使用三元条件的仿真(您尝试过的固定版本):

    $subDerr = ('default', $specialSubDerr[$dasName])[$specialSubDerr.Contains($dasName)]
    

    或者,更明确地说(带有短路):

    $subDerr = if ($specialSubDerr.Contains($dasName)) { $specialSubDerr[$dasName] }
               else                                    { 'default' }
    

    【讨论】:

      猜你喜欢
      • 2015-09-29
      • 1970-01-01
      • 2021-06-12
      • 1970-01-01
      • 2015-09-09
      • 2016-05-15
      • 2022-01-01
      • 2019-10-08
      • 2015-09-26
      相关资源
      最近更新 更多