gpt4 book ai didi

arrays - PowerShell 枚举一个只包含一个内部数组的数组

转载 作者:行者123 更新时间:2023-12-01 12:05:38 26 4
gpt4 key购买 nike

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

我使用 foreach 获取列表,但它将列表对象视为数组并返回列表对象的第一项。

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


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

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

我希望结果的输出是:
win2008r2
win2008r2
赢2012

但真正的结果是

win2008r2
赢2012
为什么 powershell auto 将内部数组扩展到它的父级?

最佳答案

您误解了数组构造的一般方式和 @()运算符特别适用于 PowerShell。如果您查看 2 个数组变量的值,您会注意到只有第二个具有嵌套数组:

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

外部数组子表达式仅展开外部数组,因此结果最终仍然是数组数组。基本上,您不需要外部 @()想要的结果。删除它,您将获得完全相同的结果:
$OSName2 = @("win2008r2"), @("win2012")

要使用单个嵌套数组获得类似的结果,您需要使用一元数组构造运算符:
$OSName1 = ,@("win2008r2")

关于arrays - PowerShell 枚举一个只包含一个内部数组的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57390858/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com