【问题标题】:PowerShell enumerate an array that contains only one inner arrayPowerShell 枚举一个仅包含一个内部数组的数组
【发布时间】:2019-12-14 21:09:44
【问题描述】:

考虑一下: 这是一个数组,仅包含一项。而数组的项是另一个数组(我称之为列表对象)。 我想获取数组中唯一的列表对象。

我使用foreach来获取列表,但是它把列表对象当作一个数组,返回列表对象的第一项。

$OSName1 = @(
    @("win2008r2")
)
$OSName2 = @(
    @("win2008r2"),
    @("win2012")
)


foreach ($osname in $OSName1) {
    write-host $osname[0]
}

foreach ($osname in $OSName2) {
    write-host $osname[0]
}

我希望结果的输出是: win2008r2 win2008r2 win2012

但真正的结果是 w win2008r2 赢2012 为什么powershell自动将内部数组扩展到它的父级?

【问题讨论】:

  • 我猜它认为第一个只是一个字符串,所以 $osname[0] 是第一个字符 (w)
  • 但是我已经用@() 明确指出它是一个项目
  • "为什么 powershell 会自动将内部数组扩展到它的父级?"因为这就是 PowerShell 的本质,它是一个过分热心的管道 :)
  • 如何避免?我尝试添加 @() 但似乎 powershell 没有接受它。

标签: arrays list powershell


【解决方案1】:

您误解了一般的数组构造和 @() 运算符在 PowerShell 中的工作原理。如果你看一下你的 2 个数组变量的值,你会注意到只有第二个有嵌套数组:

PS C:\> ConvertTo-Json $OSName1 [ “win2008r2” ] PS C:\> ConvertTo-Json $OSName2 [ [ “win2008r2” ], [ “win2012” ] ]

这是因为数组子表达式运算符@() 计算嵌套表达式,然后将结果作为数组返回。但是,当您将一个数组子表达式嵌套到另一个数组子表达式中时,内部子表达式的结果会在外部子表达式的求值时自动展开。因此,您的第一个变量变为 ['win2008r2'] 而不是预期的 [['win2008r2']]

您的第二个示例按您预期的方式工作,因为外部数组子表达式不仅包含嵌套数组子表达式,还包含嵌套子表达式的 array

@(...), @(...)
      ^
       `- this comma is what actually creates the array of arrays

外层数组子表达式只展开外层数组,所以结果最后还是一个数组数组。基本上,您不需要外部 @() 来获得所需的结果。删除它,你会得到完全相同的结果:

$OSName2 = @("win2008r2"), @("win2012")

要仅使用单个嵌套数组获得类似的结果,您需要使用一元数组构造运算符:

$OSName1 = ,@("win2008r2")

【讨论】:

    【解决方案2】:

    添加到 Ansgar 的解释中,您只需要一个嵌套数组来实现您所需要的。

    $OSName1 = @(
        @("win2008r2")
    )
    $OSName2 = @(
        @("win2008r2"),
        @("win2012")
    )
    
    
    foreach ($osname in $OSName1) 
    {
        $OSName
        foreach($OS2 in $OSName2 )
        {
        $OS2
        }
    }
    

    希望对你有帮助。

    【讨论】:

    • 您的代码不会创建嵌套数组(并且数组的声明方式与问题中的方式相同)。你是说嵌套的loops吗?为什么需要嵌套循环?也不清楚你的答案与 Ansgar 的关系如何,这解释了真正的问题。
    猜你喜欢
    • 2021-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-21
    • 1970-01-01
    • 2012-08-05
    • 2013-08-16
    • 2013-05-06
    相关资源
    最近更新 更多