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

标签 powershell conditional-operator

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

相关文章:

arrays - Powershell 如何重载数组索引运算符?

powershell - 以编程方式设置 Azure 记录合作伙伴

java - 无法在 Java 中使用 orElseThrow 抛出自定义异常

c++ - 条件运算符 : How much flexibility?

Excel 2007 - 条件格式 - 根据单元格区域中的值设置单元格格式

c# - 如何在 c++/cli 中使用 Runspace.StateChanged 事件?

powershell - 调用命令的问题

azure - Powershell Connect-AzureAD 错误 "accessing_ws_metadata_exchange_failed"

python - 为什么 "if-else-break"在 python 中中断?

c - 获取条件表达式的地址