首页 > 解决方案 > Powershell 5.1 三元数组赋值

问题描述

我对 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")

关于三元运算符的线程并没有为我澄清这一点。(PowerShell中的三元运算符

更新: $d 需要是一个数组,以及两个内部项目。为简单起见,这里只显示了一个字符串常量。

标签: powershellconditional-operatorternary

解决方案


笔记:

  • PowerShell (Core) 7+现在有一个内置的n 三元运算符,因此您可以使用类似的东西$var = $true ? "True" : "False"

不要{ ... }在你的操作数周围使用:{ ... }用于脚本块文字,它在字符串上下文中评估它们的逐字内容(没有分隔符)。

省略封闭{}解决直接问题:

$d = @( @("True") , @("False") )[!$false]
write-host "d:" $d

但是,根据您的意图,@()使用数组子表达式运算符似乎既多余又无效;以上等价于:

$d = ( "True", "False" )[!$false]
write-host "d:" $d

请注意,数组文字@(...)不需要;使用数组构造器操作符通常就足够了。有关更多信息,请参阅此答案的中间部分。,

如果你想$d成为一个数组,你需要应用@(...)整个表达式:

# $d is now a 1-element array containing 'False'
$d = @(( "True", "False" )[!$false])
write-host "d:" $d

或者,类型约束 $d为数组:

# $d is now a 1-element array containing 'False'
[array] $d = ( "True", "False" )[!$false]
write-host "d:" $d

推荐阅读