Создание неровного многомерного массива с одним массивом внутри него

#arrays #powershell

#массивы #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
  

Однако на данный момент, когда я запускаю this, я получаю неожиданный результат

 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:

Ваши 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 Объект[] 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
]