Основи PowerShell масиви та таблиці хешування, Windows IT Pro
Масиви та таблиці хешування – дві базові структури, в яких для ефективної роботи в оболонці PowerShell необхідно розбиратися. Освоївши принципи роботи з масивами та таблицями хешування, ви вже будете на шляху до того, щоб стати досвідченим користувачем PowerShell
Масиви та таблиці хешування – дві найважливіші структури даних, доступні в сучасних мовах написання сценаріїв. Оболонка Windows PowerShell (http://www.windowsitpro.com/topics/powershell-scripting) підтримує обидві структури. Масив, який іноді називають "колекцією", містить список елементів. Таблиця хешування, яку ще називають "словником" або "масивом асоціацій", містить списки пар елементів. Далі у статті я покажу, як створювати масиви та таблиці хешування, а також отримувати доступ до їх елементів.
Створення масиву
Масиви корисні в тих випадках, коли ви збираєтеся зберігати та переглядати список чи колекцію елементів. Один із найпростіших способів створити масив – використовувати команду PowerShell, яка виводить більше одного об'єкта. Наприклад, після простого запуску команди Get-ChildItem буде виведено список об'єктів у поточному розташуванні. Цей список може бути збережений у змінній. Якщо поточне розташування містить більше одного об'єкта, змінна, в якій ви зберегли список, стає масивом. Це справді просто. Наприклад, розглянемо наступну команду PowerShell:
Після виконання цієї команди змінна $list містить масив об'єктів FileInfo та DirectoryInfo.
Інший спосіб створити масив - вказати об'єкти, розділивши їх комами, і присвоїти їх змінної:
Доступ до елементів масиву
Існує три способи звернення до елементів масиву.
- Використання інструкції foreach. Інструкція foreach оболонки PowerShell надає зручний спосіб звернення до будь-якого елемента масиву. Наприклад, щоб вивести на екран елемент масиву $list, потрібно запустити команду:
- Використання команди ForEach-Object. Команда ForEach-Object розглядає масив як вхідні дані з конвеєра і передає кожен об'єкт масиву блок сценарію для обробки. Поточний елемент масиву представлений спеціальною змінною $_. Щоб вивести на екран елемент масиву $list за допомогою команди ForEach-Object, використовуйте команду:
- Використання інструкції з номером індексу. До кожного об'єкта (елементу) масиву можна звернутися за відповідним номером, починаючи з 0. Наприклад, вираз $list[0] посилається на перший елемент у масиві, вираз $list[1] посилається на другий елемент, і так далі. Так, щоб вивести на екран кожен член масиву за допомогою інструкції for та номера індексу, запустіть команду:
З цих трьох підходів спосіб з індексами використовується найрідше. Основна причина в тому, що інструкція foreach та команда ForEach-Object забезпечують швидше виконання завдання.
При вивченні цих трьох підходів основне питання звучить так: у чому різниця між використанням інструкції foreach та команди ForEach-Object? Різниця в першу чергу в тому, що при використанні інструкції foreach необхідно витягти всі елементи масиву, перш ніж ви зможете отримати доступ до них. І навпаки, команда ForEach-Object використовує переваги конвеєра PowerShell, дозволяючи отримати доступ одразу до окремого елементу.
Який із підходів вибрати? Відповідь залежить від елементів масиву. Якщо у вас порівняно невелика кількість елементів масиву та витяг не займе багато часу,Інструкція foreach буде працювати відмінно. Якщо ж у вас великий список елементів і вилучення елементів потребує значного часу (наприклад, файли на віддаленому файловому сервері), ви, швидше за все, захочете використовувати команду ForEach-Object. Також варто подумати про застосування команди Write-Progress. Якщо ви бажаєте задіяти цю команду у сценарії, щоб інформувати користувача про хід виконання операції, вам доведеться попередньо витягти всі об'єкти за допомогою інструкції foreach – це необхідно для розрахунку відсотка виконаної роботи.
Є ще один момент, через який можуть виникнути труднощі при виборі між інструкцією foreach та командою ForEach-Object: псевдонімом команди ForEach-Object є ключове слово foreach! Не забувайте, що при використанні виразу foreach після вертикальної риси () у конвеєрі PowerSh ell насправді ви викликаєте команду ForEach-Object.
Створення таблиці хешування
Якщо вивести цю таблицю хешування на екран (просто написати $hash у рядку PowerShell та натиснути клавішу введення), ви побачите результати, наведені на малюнку. Зауважте, що оболонка PowerShell виводить дані стовпця Name у довільному порядку. Одна з особливостей таблиці хешування у тому, що іменовані елементи немає певного порядку.

Доступ до елементів таблиці хешування
Щоб отримати значення з таблиці хешування, можна вказати ім'я таблиці хешування і далі ім'я елемента, значення якого ви хочете отримати, укладене у квадратні дужки. Або ви можете поставити крапку між іменем таблиці та ім'ям елемента, значення якого ви хочете отримати. Наприклад, для створеної раніше змінної $hash будь-яка з наведених нижче команд поверне значення 192.168.17.21:
Майте на увазі, що лапки в команді $hash[«server1»] необхідні. Без них оболонка PowerShell не зможе отримати інформацію про те, як обробляти ключ server1. Однак, якщо ім'я сервера зберігається в змінній (наприклад, $serverName), ви можете застосувати команду:
Деякі команди PowerShell використовують таблиці хешування як значення для параметрів. Наприклад, команда Select-Object задіює таблиці хешування для виведення на екран властивостей, що обчислюються. Щоб використовувати таблицю хешування при створенні обчислюваної властивості для команди Select-Object, вона повинна мати два парні значення: Name, яке задає ім'я обчислюваної властивості, та Expression, яке містить блок сценаріїв, що відповідає за обчислення властивості. Наприклад, візьмемо команду:
У цьому випадку команда Select-Object виведе ім'я, час останнього запису та день тижня для кожного файлу та каталогу в інсталяційній папці Windows. Як і у випадку з командою ForEach-Object спеціальна змінна $_ посилається на поточний об'єкт.
Поділіться матеріалом з колегами та друзями