为什么 Powershell 中的三元运算符不分配我的值?

Why isn't the Ternary Operator in Powershell assigning my value?

所以我有以下 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 的值?

using the ternary operator of Powershell

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

注:

  • 数组文字不需要 @(...) - 它在 5.0 及以下的 PowerShell 版本中效率低下,但更重要的是,它通过错误地暗示它 构造 数组来引起概念上的混淆 - 请参阅 .

    的底部部分
  • 不要对单个命令或表达式使用$(...)除了里面的[=55] =]可扩展字符串 ("...") and/or 如果你需要在另一个语句中嵌入多个语句。

  • PowerShell 默认不区分大小写,所以有no 需要使用 .ToUpper().

    对哈希表条目的键进行大小写规范化
  • {...}定义了一个script block, which is a reusable piece of PowerShell code that you can execute on demand later, typically via &, the call operator;就其本身而言,一个脚本块 打印 作为其 字符串化值 ,这是开头之间的 文字内容 { 和结束 }如果要输出 values.

    ,请按原样使用脚本块 not

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

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

注意:严格来说,上面也选择了'default',如果有键$dasName存在,但是恰好有值$null.

或者,使用三元条件

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

早期版本中,使用模拟三元条件(固定版本你尝试过的):

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

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

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