#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 ]