【问题标题】:Why isn't the Ternary Operator in Powershell assigning my value?为什么 Powershell 中的三元运算符不分配我的值?
【发布时间】:2023-03-13 05:40:02
【问题描述】:
所以我有以下 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
那么在执行的最后两行,为什么没有赋值给$subDerr?
【问题讨论】:
标签:
powershell
conditional-operator
【解决方案1】:
使用Powershell的三元运算符
您的代码确实不使用PowerShell的三元运算符,该运算符仅在v7.0+中可用;相反,它使用 次优仿真,将 2 元素数组与条件相结合,其布尔结果映射到数组索引 0(对于 $false)或 1(对于 $true) .
除了在概念上不明显之外,解决方法不是最理想的,因为它不会短路替代方案的评估;也就是说,数组的两个元素在被选择之前无条件评估。
注意:
不要将 @(...) 用于数组字面量 - 这不仅没有必要,而且在 PowerShell 5.0 以下版本中效率低下,而且更重要的是,它会引起概念上的混淆错误地暗示它 构造 数组 - 请参阅 this answer 的底部。
不要将$(...) 用于单个命令或表达式,除了在可扩展字符串中("...")和/或者如果您需要在另一个语句中嵌入多个语句。
PowerShell 默认不区分大小写,因此没有需要使用.ToUpper()。
{...} 定义了一个script block,这是一个可重复使用的 PowerShell 代码,您可以在稍后按需执行>,通常通过&、call operator;脚本块本身打印作为它的字符串化值,它是开头{和结尾}之间的文字内容 ; 如果您想输出值,请不要按原样使用脚本块。
在 PowerShell [Core] 7.0+ 中,您可以使用 null-coalescing 运算符 ?? 来获得您想要的:
$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' }