创建一个Jagged \ Multidimensional数组,其中包含一个数组

时间:2016-09-30 20:25:32

标签: arrays powershell

我目前遇到一个脚本问题,该脚本根据传递给它的动态服务器\优先级集构建一个数组。例如,基于下面的输入

server1,200
server2,200

我想构建一些看起来像

的东西
$arr=@() #at this point I have an empty array
$arr+=@("server1",200) #at this point, I would expect to have an array
                       #that itself holds another array

但是在这一点上,当我运行这个时,我得到了意想不到的输出

echo $arr.count # result is 2, rather than the 1 I would expect
                # It appears to be treating $arr as a single array
                # with two members (server1 and 200) rather than an array
                # that holds an array, which itself has two members

但是,如果我在我的数组中添加另一个空数组:

$arr = @()
$arr += @()
$arr += $("server1",200)
$arr.count # output is 2, which is the desired result

我得到了我想要的结果。我的问题是..我可以在里面只有一个数组得到我想要的锯齿状\多维数组的结果吗?这不会是一个常见的情况,因为大多数时候我会处理多组项目,但是我想考虑所有场景,这可能是一个弹出的场景。我只是想为了满足这个要求而不必添加额外的过滤空数组的步骤。

非常感谢任何输入。

1 个答案:

答案 0 :(得分:1)

你的2个例子产生完全相同的结果,一个包含2个元素的平面数组,因为附加一个空数组($arr+=@())不会以任何方式修改数组。

演示:

PS C:\> $arr = @()
PS C:\> $arr += @('server1', 200)
PS C:\> $arr.Count
2
PS C:\> Format-Custom -InputObject $arr
server1
200
PS C:\> $arr = @()
PS C:\> $arr += @()
PS C:\> $arr += @('server1', 200)
PS C:\> $arr.Count
2
PS C:\> Format-Custom -InputObject $arr
server1
200

当您使用附加运算符(+=)和两个数组时,PowerShell基本上连接数组。要将数组作为嵌套元素附加到第一个数组,您需要在第二个数组前加上一元数组构造运算符(,)。

PS C:\> $arr = @()
PS C:\> $arr += ,@('server1', 200)
PS C:\> $arr += ,@('server2', 200)
PS C:\> $arr.Count
2
PS C:\> Format-Custom -InputObject $arr

[
  server1
  200
]

[
  server2
  200
]

如果您事先知道元素的数量,您还可以预先创建所需大小的数组,并将嵌套数组指定为其元素。这不需要逗号运算符。

PS C:\> $arr = New-Object Object[] 2
PS C:\> $arr.Count
2
PS C:\> $arr[0] = @('server1', 200)
PS C:\> $arr[1] = @('server2', 200)
PS C:\> Format-Custom -InputObject $arr

[
  server1
  200
]

[
  server2
  200
]