Обычно массив представляет из себя набор компонентов (элементов массива), расположенных друг за другом в определенном порядке. Каждый элемент массива имеет свой порядковый номер, а доступ к элементам массива осуществляется при помощи индексации, т.е. по ссылке с указанием номера (индекса) нужного элемента. Но массив не обязательно должен состоять из нескольких элементов, он может включать в себя только один элемент или вообще быть пустым.
При работе с массивами необходимо помнить о том, что по умолчанию PowerShell пытается самостоятельно определить тип данных. Для примера возьмем переменную и поместим в нее несколько чисел, а затем проверим тип данных в переменной:
$a = 1, 2, 3
$a.GetType()
Как видите, в данном случае мы получаем массив (System.Array). Но если в переменную поместить одно значение, то PowerShell не будет формировать массив:
$b = 1
$a.GetType()
Как видно из примера, PowerShell определяет тип данных в переменной в зависимости от количества объектов. Но мы не всегда можем точно заранее сказать, сколько объектов будет получено в результате выполнения той или иной команды, поэтому необходимо иметь код, который будет всегда рассматривать результат как массив.
Сделать это можно разными способами, например с помощью оператора ″,″ . Если запятая используется как бинарный оператор, то создается обычный массив, а если как унарный — то массив с одним элементом. Например так получим массив, состоящий из одного элемента:
$b = ,1
Можно явно указать тип данных в переменной, не давая PowerShell простора для фантазии, например так:
[object[]]$b = 1
Здесь надо упомянуть, что каждый элемент массива также имеет свой тип данных, а тип object[] позволяет добавлять в массив любые объекты. При необходимости можно ограничить члены массива определенным типом данных (типизированный массив). Например можно указать в качестве элементов массива только целочисленные значения:
[int32[]]$b = 1
А так мы определим в качестве членов массива системные процессы:
[System.Diagnostics.Process[]]$b = Get-Process
Также создать массив можно с помощью оператора подвыражения массива ″@″, который формирует массив в любом случае, даже при полном отсутствии объектов. Очень удобно сначала инициализировать переменную как массив, а затем добавлять в нее нужные объекты, не беспокоясь об их количестве:
$b = @()
$b = 1
Ну и в завершение еще один способ, подсмотренный на MSDN. Его суть в том, что объекты передаются по конвейеру специальной функции, которая преобразует их в массив. Выглядит примерно так:
function Out-Array {begin {$out = @()}; process {$out += $_}; end {return, $out}}
$b = 1 | Out-Array
Способ не самый прямой и не самый быстрый, но вполне рабочий.