且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

PowerShell枚举一个仅包含一个内部数组的数组

更新时间:2023-11-23 08:51:04

您通常会误解数组构造,尤其是 @()运算符在PowerShell中的工作方式.如果您看一下2个数组变量的值,您会注意到只有第二个数组变量具有嵌套数组:

You're misunderstanding how array construction in general and the @() operator in particular work in PowerShell. If you take a look at the value of your 2 array variables you'll notice that only the second one has nested arrays:


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

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

That is because the array subexpression operator @() evaluates the nested expression and then returns the result as an array. But when you're nesting an array subexpression into another array subexpression the result of the inner subexpression is automatically unrolled upon the evalution of the outer subexpression. Because of that your first variable becomes ['win2008r2'] instead of the intended [['win2008r2']].

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

Your second example works the way you expect because the outer array subexpression contains not just a nested array subexpression, but an array of nested subexpressions:

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

外部数组子表达式仅展开外部数组,因此最终结果仍然是数组数组.基本上,您不需要外部的 @(())即可获得所需的结果.删除它,您将得到完全相同的结果:

The outer array subexpression unrolls only the outer array, so that the result is still an array of arrays in the end. Basically, you don't need the outer @() for the desired result. Remove it and you will get the exact same result:

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

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

To get a similar result with just a single nested array you need to use the unary array construction operator:

$OSName1 = ,@("win2008r2")