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