Създаване на Hashtable в PowerShell, добавяне, изтриване, сортиране на елементи WindowsPro
В допълнение към масивите, PowerShell поддържа и друг сложен тип данни с хеш таблици. Той предоставя методи за търсене, добавяне, промяна или изтриване на двойки ключ/стойност. Hashtables могат да се използват по много начини, например за предаване на стойности на параметри на cmdlet.

Основната разлика между обикновените масиви и хеш таблиците, които също се наричат асоциативни масиви, е, че можете да използвате не просто числов индекс, а всеки .NET обект като ключ. По този начин Hashtables се състоят от колекция от двойки ключ/стойност.
Масиви срещу хаштаби
Ако създадете този масив, например
след това извиквате втория елемент със стойността "бяло" чрез $ colors [1]. Съответно, можете просто да прегледате цялото поле, като увеличите индекса (вижте Масиви в PowerShell: създаване, промяна, четене, сортиране, изтриване).
Hashtables, от друга страна, винаги се състоят от двойки под формата на ключ = стойност. За да остане в темата за цветовете, хеш таблицата може да изглежда така:
Със синтаксиса за създаване на асоциативен масив, уверете се, че двойките ключ/стойност са в къдрави скоби (с нормални масиви те са кръгли) и разделени с точка и запетая (с масиви също е разрешена запетая). Стойността се присвоява на ключ, като се използва знакът за равенство.
Достъп до елементи
Ако сега искате да получите достъп до втория елемент със стойността "Бяло", PowerShell предлага няколко опции за това. Аналогично на масивите, с които бихте могли да направите това
да направя. Както можете да видите, ключът "стена" се използва тук като индекс, а не като числова стойност (дори ако такава стойност лесно може да се използва като ключ).
Както при масивите, PowerShell позволява адресиране на няколко елемента едновременно:
Като алтернатива можете да използвате нотацията
използвайте или ако искате да е по-сложно, използвайте функцията Get_Item:
Ако не получите резултат, тогава стойността за този ключ $ може да бъде нула или ключът не съществува. За да проверите дали е налице, използвайте функцията ContainsKey:
Противникът, функцията ContainsValue (), от друга страна, ви информира дали в таблицата присъства определена стойност:
И двете функции връщат True или False, в зависимост от това дали намират стойността, която искате.
Ако искате да изведете цялото съдържание на таблицата, тогава, както обикновено в PowerShell, просто трябва да въведете името на променливата. Като командата
показва обаче, че по този начин получавате цялата хеш-таблица като един обект.
Колко елемента съдържа, може да се разбере с помощта на броя на свойствата, точно като масив:
ще отпечата 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 -Simname Meier -Path "OU = потребител, DC = contoso, DC = Com"
може да се процедира по следния начин:
Моля, обърнете внимание, че хеш таблицата се предшества от „@“, а не от „$“.