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"
]
]
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']]
.
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")
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…