[英]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.