Powershell 5.1 三元数组赋值
Posted
技术标签:
【中文标题】Powershell 5.1 三元数组赋值【英文标题】:Powershell 5.1 ternary with array assignment 【发布时间】:2021-10-07 23:11:01 【问题描述】:我对 Powershell 5.1 中的三元运算符有疑问。如果我尝试分配数组 @(...):
,它不会像我预期的那样工作 # I can assign an array to a variable:
$a=@("TRUE")
write-host "a:" $a
# I can do that in a proper if/then statement, too:
$b = @(if ($false) @("True") else @("False"))
write-host "b:" $b
# Assignment of string constants works fine with ternary syntax:
$c = @( "True" , "False" )[!$true]
write-host "c:" $c
# but not with array assignments:
$d = @( @("True") , @("False") )[!$false]
write-host "d:" $d
# Expected: "False".
# Actual output: @("False")
输出:
a: TRUE
b: False
c: "True"
d: @("False")
关于三元运算符的线程并没有为我澄清这一点。 (Ternary operator in PowerShell)
更新: $d 需要是一个数组,以及两个内部项。为简单起见,这里只显示了一个字符串常量。
【问题讨论】:
【参考方案1】:注意:
PowerShell (Core) 7+ 现在有一个 built-in 三元运算符,因此您可以使用像$var = $true ? "True" : "False"
这样的东西
不要在您的操作数周围使用 ...
: ...
用于script-block 文字,其计算结果为它们的逐字内容(没有分隔符) 字符串上下文。
省略封闭的 和
解决了直接的问题:
$d = @( @("True") , @("False") )[!$false]
write-host "d:" $d
但是,@()
、array-subexpression operator 的使用似乎既多余又无效,这取决于您的意图;以上等价于:
$d = ( "True", "False" )[!$false]
write-host "d:" $d
注意 @(...)
对于数组 literals 从来不是必需的;使用,
,array constructor operator,通常就足够了。更多信息见this answer的中间部分。
如果您希望$d
成为一个数组,则需要将@(...)
应用于整个 表达式:
# $d is now a 1-element array containing 'False'
$d = @(( "True", "False" )[!$false])
write-host "d:" $d
或者,type-constrain $d
是一个数组:
# $d is now a 1-element array containing 'False'
[array] $d = ( "True", "False" )[!$false]
write-host "d:" $d
【讨论】:
谢谢,它成功了。具体应用是通过连接前面和后面的部分来从数组 $a 中消除元素编号 x: $LastElement = $a.GetUpperBound(0); if ($LastElement -ge 0) $a = @(@(@(),@($a[0..($x-1)]))[$x -ne 0]; @(@() , @($a[($x+1)..$LastElement]))[$x -ne $LastElement])以上是关于Powershell 5.1 三元数组赋值的主要内容,如果未能解决你的问题,请参考以下文章