我目前遇到一个脚本问题,该脚本根据传递给它的动态服务器\优先级集构建一个数组。例如,基于下面的输入
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
我得到了我想要的结果。我的问题是..我可以在里面只有一个数组得到我想要的锯齿状\多维数组的结果吗?这不会是一个常见的情况,因为大多数时候我会处理多组项目,但是我想考虑所有场景,这可能是一个弹出的场景。我只是想为了满足这个要求而不必添加额外的过滤空数组的步骤。
非常感谢任何输入。
答案 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 ]