Створіть Hashtable в PowerShell, додайте, видаліть, сортуйте елементи WindowsPro
На додаток до масивів, PowerShell підтримує ще один складний тип даних із хеш-таблицями. Він надає методи пошуку, додавання, зміни або видалення пар ключ/значення. Хеш-таблиці можна використовувати різними способами, наприклад для передачі значень параметрам командлета.

Основна відмінність між звичайними масивами та хеш-таблицями, які також називаються асоціативними масивами, полягає в тому, що ви можете використовувати не просто числовий індекс, а будь-який .NET-об'єкт як ключ. Таким чином, хеш-таблиці складаються з колекції пар ключ/значення.
Масиви проти хештегов
Наприклад, якщо ви створюєте цей масив
тоді ви викликаєте другий елемент зі значенням "білий" через $ colors [1]. Відповідно, ви можете просто перебирати все поле, збільшуючи індекс (див. Масиви в PowerShell: створення, зміна, зчитування, сортування, видалення).
Хеш-таблиці, навпаки, завжди складаються з пар у формі ключ = значення. Щоб не відставати від теми кольорів, хеш-таблиця може виглядати так:
З синтаксисом для створення асоціативного масиву переконайтеся, що пари ключ/значення знаходяться у фігурних дужках (із звичайними масивами вони круглі) та розділені крапками з комою (з масивами також допускається кома). Значення присвоюється ключу за допомогою знака рівності.
Доступ до елементів
Якщо ви тепер хочете отримати доступ до другого елемента зі значенням "Білий", PowerShell пропонує кілька варіантів для цього. Аналогічно масивам, з якими ви могли б це зробити
зробити. Як бачите, ключ "стіна" служить індексом, а не числовим значенням (навіть якщо таке значення можна використовувати як ключ).
Як і у випадку з масивами, PowerShell дозволяє адресувати декілька елементів одночасно:
Крім того, ви можете використовувати позначення
використовувати, або якщо ви хочете, щоб воно було більш складним, використовуйте функцію Get_Item:
Якщо ви не отримаєте результату, тоді або значення для цього ключа $ може бути нульовим, або ключ не існує. Щоб перевірити, чи він присутній, використовуйте функцію ContainsKey:
З іншого боку, опонент, функція ContainsValue (), повідомляє, чи є певне значення в таблиці:
Обидві функції повертають True або False, залежно від того, знаходять вони потрібне значення.
Якщо ви хочете вивести весь вміст таблиці, то, як зазвичай у PowerShell, вам просто потрібно ввести ім'я змінної. Як і команда
однак таким чином ви отримуєте всю хеш-таблицю як один об'єкт.
Скільки елементів він містить можна дізнатись за допомогою властивості count, як і масив:
у нашому прикладі буде надруковано 4.
Перебирайте хеш-таблиці
У різних випадках ви хочете прокрутити всю колекцію. Хоча вам потрібно лише підрахувати індекс масиву, тут вам потрібен інший метод.
З одного боку, підходить цикл foreach по всіх клавішах, який при кожному проходженні займає другу змінну з поточним ключем:
foreach ($ k у $ кольорах. ключі)
З іншого боку, функція GetEnumerator () ідеально підходить для цього завдання, так що ви можете зберегти собі змінну запуску:
Якщо ви хочете знайти всі елементи, що мають певне значення, вам не потрібно перебирати словник, фільтр із Where-Object (псевдонім "?") Те саме робить тут:
Додати ключ
Як показано вгорі, ви можете вставити пари ключ/значення при оголошенні хеш-таблиці. Наприклад, якщо у вас порожня хеш-таблиця
запускається або просто хоче додати більше до існуючих ключів, для цього існує кілька варіантів. Найбільш очевидний дотримується того ж синтаксису, що і оголошення:
Крім того, хеш-таблиця забезпечує для цього метод add ():
Нарешті, для цього завдання можна також використовувати оператор додавання:
Як ви легко бачите, ви створюєте власну хеш-таблицю для нового ключа. Отже, це процес, за допомогою якого можна загалом поєднати два асоціативні масиви.
Клавіша видалення
Щоб видалити ключ зі словника, PowerShell забезпечує метод remove (). Це означає, що при кожному дзвінку можна видалити лише одну пару:
Справа ускладнюється, коли ви хочете переглядати таблицю, щоб видалити ключі, що мають певне значення, у наступному прикладі це буде "зеленим":
Однак PowerShell визнає цю процедуру повідомленням "Помилка при перегляді списку: Список було змінено. Процес перерахування може бути неможливим".
Якщо ви хочете уникнути цієї реакції та досягти надійного результату, функція clone () допомагає отримати окреме посилання на таблицю:
Якщо ви хочете видалити всі клавіші, функція clear () служить для цього:
Сортувати хеш-таблицю
Очевидним підходом може бути передача вихідних даних змінної до Sort-Object:
$ кольори | sort # не працює
Як ми вже бачили вище, введення імені змінної повертає всю хеш-таблицю як один об'єкт, тому сортування елементів не слід очікувати таким чином.
Вам також потрібно переглядати словник для сортування, завдяки чому метод GetEnumerator () знову корисний:
$ colors.GetEnumerator () | sort -Ім'я властивості
Цей приклад сортує елементи за ключем. Якщо ви хочете відсортувати їх відповідно до значень, замініть ім'я на значення у вищезазначеному виклику.
Звичайно, ви могли б придумати ідею введення ключів у відсортованому порядку при створенні хеш-таблиці. Однак швидко стає очевидним, що PowerShell не зберігає це сортування і виводить пари ключ/значення в будь-якому порядку.
Однак цю поведінку можна вимкнути, використовуючи ключове слово [порядок], починаючи з PowerShell 3.0:
Однак не можна використовувати привід для перетворення існуючої хеш-таблиці в упорядковану колекцію.
Splatting: Виклик командлетів за допомогою Hashtable
Типовим використанням хеш-таблиць є збереження в них параметрів та їх значень перед передачею їх на командлет. Особливо у командлетах з великою кількістю параметрів, наприклад New-ADUser, код явно чіткіший.
Замість того, щоб викликати командлет як зазвичай:
New-ADUser -Name Max.Meier -GivenName Max -Purname Meier -Path "OU = user, DC = contoso, DC = Com"
можна було б діяти наступним чином:
Тут слід зазначити, що перед хеш-таблицею стоїть '@', а не '$'.