繁体   English   中英

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

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

所以我有以下powershell脚本......使用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 的三元运算符

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

笔记:

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

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

  • 默认情况下,PowerShell不区分大小写,因此无需使用.ToUpper()对哈希表条目的键进行大小写规范化。

  • {...}定义了一个脚本块,它是一段可重用的 PowerShell 代码,您可以稍后按需执行,通常通过调用运算符&执行; 脚本块本身打印为其字符串化值,即开头{和结尾}之间的文字内容 如果要输出,请不要按原样使用脚本块


PowerShell [Core] 7.0+中,您可以使用空合并运算符?? 得到你想要的:

$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' }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM