Массивы Powershell
Массивы – одна из основных функций большинства языков программирования. Массив состоит из коллекции элементов. Выполнив итерацию (проход) по массиву можно получить доступ к любому элементу коллекции. Массивы Powershell можно создать несколькими способами. Рассмотрим их подробнее.
Создание массива
Создать массив можно при помощи конструкции @()
$massiv=@()
Я создал переменную $massiv и добавил в нее пустой массив. Как видно на картинке переменная имеет тип массив (System.Array). Добавлять элементы в строковый массив можно через запятую.
$massiv=@("odin","dva","tri")
Возможен и другой тип записи, каждый элемент с новой строки
$massiv=@("Petya"
"Vasya"
"Masha")
Массив можно создать просто объявив переменную с перечисленным списком значений
$newmassiv="volga","lada","uaz"
В массиве допускается использование данных разных типов. Например можно записать строку и число
$newmassiv="volga",3,"uaz"
Работа с элементами массива
Доступ к элементу массива можно получить с помощью квадратный скобок [] указав внутри номер элемента. Номера элементов массива начинаются с 0.
$test="raz","dva","tri"
Вывод элементов
Доступ к первому элементу массива можно получить так:
$test[0]
raz
Удобство в том, что доступ можно получить сразу к нескольким элементам, указав их через запятую.
$test[0,1]
raz
dva
Либо указав начальный и конечный элемент используя оператор ..
$test[0..2]
raz
dva
tri
Вывод элементов в обратном порядке также возможен
$test[2..0]
tri
dva
raz
Когда необходимо вывести последний элемент с конца массива можно использовать -1
$test[-1]
tri
Подсчитать количество элементов в массиве можно с помощью свойства Count
$test.Count
3
Используя подсчет элементов в массиве Count можно, например, контролировать количество запущенных процессов. Рассмотрим пример в котором подсчитаем количество запущенных процессов firefox. Если процессов более 10, будем выводить сообщение.
$gp=Get-Process -Name firefox
$gp.Count
if ($gp.Count -ge 10) {Write-Host "Многовато открыто вкладок, закрой парочку"}
Обновление элементов
Обновить значение элементов в массиве можно используя его номер и указав новое значение взамен старого
$test[1]="chetire"
$test[2]="pyat"
Причем таким способом мы именно обновляем уже существующие элементы в массиве. Добавить новый элемент не получится. Если ввести команду $test[3]=”shest” появится ошибка “Индекс находился вне границ массива.“
Обновление значений элементов используя циклы
Как правило массив является коллекцией строковых или целочисленных значений. Обычно, в цикле используется переменная, которая содержит копию значения. При обновлении этой переменной исходное значение в массиве не обновляется. С решением данной проблемы поможет цикл for.
for ( $a = 0; $a -lt $massiv.count; $a++ )
{
$massiv[$a] = "Item: [{0}]" -f $massiv[$a]
}
В данном примере принимается значение по индексу $a, далее происходит изменение значения и затем этот же индекс используется для внесения значение обратно.
Математические операции с элементами
С элементами массива можно выполнять математические операции. Давайте создадим массив чисел
$mass=1..5
Затем добавим к нему элемент
$mass += 2
И уже обновленный массив умножим на 2
$mass *= 2
Удаление элементов
В Powershell массивы являются неизменяемыми и удалить элемент напрямую не получится. Варианты решения этого вопроса следующие:
Вариант №1: создать новый массив без элемента который хотим удалить.
$massiv=@("odin","dva","tri")
$massiv
$massiv2=$massiv|where {$_ -ne "dva"}
$massiv2
Переменной $massiv было присвоено 3 значения, затем была создана переменная $massiv2 в которую записали $massiv с исключением второго элемента.
Вариант №2: преобразовать массив к изменяемому типу ArrayList с возможностью удаления элементов
$massiv=@("odin","dva","tri")
$massiv
$massiv=[System.Collections.ArrayList]$massiv
$massiv.RemoveAt($massiv.Count-2)
$massiv
После преобразования массива в ArrayList мы успешно удалили значение dva
Массивы и циклы
Массивы регулярно используются в циклах. Рассмотрим простейший пример массива данных с передачей его значений по конвейеру циклу ForEach-Object (алиас foreach)
"newadmin.ru","vipadm.ru"|foreach {ping $_}
В данном случае мы создали массив из двух переменных с названиями сайтов и далее передали эти переменные по конвейеру циклу ForEach-Object. В теле цикла происходит поочередное обращение команды ping к каждому элементу массива.
Цикл ForEach-Object работает только с конвейером, для всех остальных случаев есть цикл ForEach. Рассмотрим на его примере работу с массивами.
$serv="newadmin.ru","vipadm.ru"
foreach ($s in $serv)
{Test-NetConnection -ComputerName $s -Port 80}
В этом простом сценарии мы записали в переменную $serv названия сайтов, далее циклом foreach прошлись по массиву $serv поочередно используя каждый элемент (через переменную $s). Командлетом Test-NetConnection проверили доступность порта 80 для каждого из сайтов. Очень удобно если нужно мониторить большое количество площадок в интернете, серверов и т.д.
Массивы и операторы
Использование операторов расширяет удобство использования массивов данных. Перечислю основные операторы с примерам их работы.
Split
Группирует элементы в две разные коллекции. Рассмотрим пример со списком запущенных процессов, среди них выделим процесс forefox.
$firefox, $other = (Get-Process).Where({$_.ProcessName -eq 'firefox'}, 'Split')
$firefox
Мы объявили сразу две переменные $firefox и $other. Запросив список запущенных процессов происходит фильтрация процессов с именем firefox. Отфильтрованные процессы попадают в переменную $firefox, остальные процессы попадают в переменную $other.
First
При формировании вывода можно ограничится только небольшим количеством переменных. Оператор First позволяет вывести определенное количество элементов вначале списка.
$other.Where({$_.CPU -gt "1000"}, 'First', 3)
Отфильтровав массив $other по параметру CPU более 1000 запрошен вывод только первых 3 элементов массива.
Last
Принцип работы Last схож с оператором First. Только если First выводит определенное количество элементов вначале массива, то Last выводит необходимое количество с конца списка.
$service=(Get-Service).Where({$_.Name -like 'Win*'}, 'Last', 3)
$service
В данном примере переменная $service получила значении всех сервисов с именем Win в начале. Вывод был ограничен 3 значениями с конца списка с помощью оператора Last.
Часто используемые операторы я перечислил, но их гораздо больше. Описание с примерам уже рассмотрено в моей предыдущей статье.
Больше интересных статей о Powershell читайте на нашем сайте.