Powershell

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

После преобразования массива в ArrayList мы успешно удалили значение dva

Массивы и циклы

Массивы регулярно используются в циклах. Рассмотрим простейший пример массива данных с передачей его значений по конвейеру циклу ForEach-Object (алиас foreach)

"newadmin.ru","vipadm.ru"|foreach {ping $_}
Массив и цикл ForeEach-Object

В данном случае мы создали массив из двух переменных с названиями сайтов и далее передали эти переменные по конвейеру циклу ForEach-Object. В теле цикла происходит поочередное обращение команды ping к каждому элементу массива.

Цикл ForEach-Object работает только с конвейером, для всех остальных случаев есть цикл ForEach. Рассмотрим на его примере работу с массивами.

$serv="newadmin.ru","vipadm.ru"
foreach ($s in $serv)
{Test-NetConnection -ComputerName $s -Port 80}
Массив и цикл ForEach

В этом простом сценарии мы записали в переменную $serv названия сайтов, далее циклом foreach прошлись по массиву $serv поочередно используя каждый элемент (через переменную $s). Командлетом Test-NetConnection проверили доступность порта 80 для каждого из сайтов. Очень удобно если нужно мониторить большое количество площадок в интернете, серверов и т.д.

Массивы и операторы

Использование операторов расширяет удобство использования массивов данных. Перечислю основные операторы с примерам их работы.

Split

Группирует элементы в две разные коллекции. Рассмотрим пример со списком запущенных процессов, среди них выделим процесс forefox.

$firefox, $other = (Get-Process).Where({$_.ProcessName -eq 'firefox'}, 'Split')
$firefox
Массив с процессами firefox

Мы объявили сразу две переменные $firefox и $other. Запросив список запущенных процессов происходит фильтрация процессов с именем firefox. Отфильтрованные процессы попадают в переменную $firefox, остальные процессы попадают в переменную $other.

Массив с остальными процессами
First

При формировании вывода можно ограничится только небольшим количеством переменных. Оператор First позволяет вывести определенное количество элементов вначале списка.

$other.Where({$_.CPU -gt "1000"}, 'First', 3)
Вывод первых 3 элементов

Отфильтровав массив $other по параметру CPU более 1000 запрошен вывод только первых 3 элементов массива.

Last

Принцип работы Last схож с оператором First. Только если First выводит определенное количество элементов вначале массива, то Last выводит необходимое количество с конца списка.

$service=(Get-Service).Where({$_.Name -like 'Win*'}, 'Last', 3)
$service
Вывод последних 3 элементов

В данном примере переменная $service получила значении всех сервисов с именем Win в начале. Вывод был ограничен 3 значениями с конца списка с помощью оператора Last.

Часто используемые операторы я перечислил, но их гораздо больше. Описание с примерам уже рассмотрено в моей предыдущей статье.

Больше интересных статей о Powershell читайте на нашем сайте.

Поделиться:
Подписаться
Уведомить о
guest
0 комментариев
Межтекстовые Отзывы
Посмотреть все комментарии