Заметки о Windows и других программных продуктах Microsoft...

Особенности работы с массивами в PowerShell

Особенности работы с массивами в PowerShell

Обычно массив представляет из себя набор компонентов (элементов массива), расположенных друг за другом в определенном порядке. Каждый элемент массива имеет свой порядковый номер, а доступ к элементам массива осуществляется при помощи индексации, т.е. по ссылке с указанием номера (индекса) нужного элемента. Но массив не обязательно должен состоять из нескольких элементов, он может включать в себя только один элемент или вообще быть пустым.

При работе с массивами необходимо помнить о том, что по умолчанию 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

функция для преобразования в массив

 

Способ не самый прямой и не самый быстрый, но вполне рабочий.

 
 
Комментарии

Пока нет комментариев.