$special-6ren">
gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 13:10:24 27 4
gpt4 key购买 nike

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

所以在执行的最后 2 行中,为什么没有分配给 $subDerr 的值?

最佳答案

using the ternary operator of Powershell

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

注意:

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

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

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

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


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

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

注意:严格来说,如果键为 $dasName 的条目存在,上面的代码也会选择 'default',但是 < em>恰好有值 $null

或者,使用三元条件:

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

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

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

或者更明确地( 短路):

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

关于powershell - 为什么 Powershell 中的三元运算符不分配我的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60423953/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com