【问题标题】:Powershell 5.1 ternary with array assignmentPowershell 5.1 三元数组赋值
【发布时间】: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 需要是一个数组,以及两个内部项。为简单起见,这里只显示了一个字符串常量。

【问题讨论】:

    标签: powershell conditional-operator ternary


    【解决方案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]) }
    猜你喜欢
    • 2020-03-03
    • 2013-04-05
    • 1970-01-01
    • 1970-01-01
    • 2019-11-05
    • 2019-07-03
    • 2016-08-01
    • 2011-07-02
    • 2012-02-14
    相关资源
    最近更新 更多