Vytvorte Hashtable v PowerShell, pridávajte, mazajte, triedte prvky WindowsPro

Okrem polí podporuje PowerShell aj iný zložený dátový typ s hašovacími tabuľkami. Poskytuje metódy na vyhľadanie, pridanie, zmenu alebo odstránenie párov kľúč/hodnota. Hashtables možno použiť mnohými spôsobmi, napríklad na odovzdávanie hodnôt parametrom cmdlet.

hashtable

Hlavný rozdiel medzi bežnými poľami a hašovacími tabuľkami, ktoré sa tiež nazývajú asociatívne polia, je v tom, že ako kľúč môžete použiť nielen číselný index, ale aj akýkoľvek objekt .NET. Hashtables teda pozostávajú zo zbierky párov kľúč/hodnota.

Polia verzus hashtables

Ak vytvoríte toto pole napr

potom vyvoláte druhý prvok s hodnotou „biela“ cez $ colors [1]. V súlade s tým môžete jednoducho iterovať celé pole zvýšením indexu (pozri Polia v PowerShell: vytváranie, zmena, čítanie, triedenie, mazanie).

Na druhej strane tabuľky hash pozostávajú z dvojíc v tvare kľúč = hodnota. Aby sme zostali pri téme farieb, hash tabuľka by mohla vyzerať takto:

Pri použití syntaxe na vytvorenie asociatívneho poľa sa uistite, že páry kľúč/hodnota sú v zložených zátvorkách (s normálnymi poľami sú okrúhle) a oddelené bodkočiarkami (s poľami je povolená aj čiarka). Hodnota je priradená klávesu pomocou znamienka rovnosti.

Prístup k položkám

Ak chcete teraz získať prístup k druhému prvku s hodnotou „White“, PowerShell ponúka niekoľko možností. Analogicky k poliam by ste to mohli urobiť

robiť. Ako vidíte, klávesnica „wall“ slúži ako index, a nie ako číselná hodnota (aj keď by sa takáto hodnota dala použiť ako kľúč).

Rovnako ako v prípade polí, aj v prostredí PowerShell je možné adresovať niekoľko prvkov naraz:

Prípadne môžete použiť notáciu

použite, alebo ak chcete, aby to bolo zložitejšie, použite funkciu Get_Item:

Ak nezískate žiadny výsledok, potom buď hodnota pre tento kľúč $ môže byť nula, alebo kľúč neexistuje. Ak chcete skontrolovať, či je k dispozícii, použite funkciu ContainsKey:

Oponent, funkcia ContainsValue (), na druhej strane informuje, či je v tabuľke určitá hodnota:

Obe funkcie vracajú hodnotu True alebo False v závislosti od toho, či nájdu požadovanú hodnotu.

Ak chcete vygenerovať celý obsah tabuľky, potom ako obvykle v prostredí PowerShell stačí zadať názov premennej. Ako príkaz

však ukazuje, že týmto spôsobom získate celú hashtable ako jeden objekt.

Koľko prvkov obsahuje, je možné zistiť pomocou vlastnosti count, podobne ako pole:

by v našom príklade vytlačil 4.

Iterujte cez hašovacie tabuľky

Pri rôznych príležitostiach budete chcieť prejsť celú kolekciu. Aj keď musíte iba spočítať index pre pole, tu potrebujete inú metódu.

Na jednej strane je vhodná slučka foreach cez všetky kľúče, pričom pri každom prechode zaberá druhú premennú s aktuálnym kľúčom:

foreach ($ k v $ farbách. Klávesy)

Na druhú stranu, funkcia GetEnumerator () je pre túto úlohu ideálna, aby ste si mohli uložiť premennú behu:

Ak chcete nájsť všetky prvky, ktoré majú určitú hodnotu, nemusíte iterovať slovník, filter s Where-Object (alias "?"):

Pridať kľúč

Ako je zobrazené na samom vrchu, pri vkladaní hašovacej tabuľky môžete vložiť páry kľúč/hodnota. Napríklad, ak máte prázdny hašovací stôl

začína alebo chce jednoducho pridať viac k existujúcim kľúčom, existuje niekoľko možností. Ten najzrejmejší sleduje rovnakú syntax ako deklarácia:

Ďalej má hašovacia tabuľka na tento účel metódu add ():

Nakoniec je možné pre túto úlohu použiť aj operátor sčítania:

Ako môžete ľahko vidieť, pre nový kľúč si vytvoríte vlastnú hashovaciu tabuľku. Ide teda o proces, ktorý sa dá vo všeobecnosti použiť na kombináciu dvoch asociatívnych polí.

Odstrániť kľúč

Na odstránenie kľúča zo slovníka poskytuje PowerShell metódu remove (). To znamená, že pri každom hovore je možné vymazať iba jeden pár:

Veci sa komplikujú, keď chcete iterovať cez tabuľku a odstrániť kľúče, ktoré majú určitú hodnotu, v nasledujúcom príklade by to bolo „zelené“:

PowerShell však tento postup potvrdzuje správou „Chyba pri prechode výpisom: Zoznam bol zmenený. Proces výpočtu nemusí byť možné vykonať.“.

Ak sa chcete vyhnúť tejto reakcii a dosiahnuť spoľahlivý výsledok, funkcia clone () pomôže získať samostatný odkaz na tabuľku:

Ak chcete odstrániť všetky kľúče, slúži na to funkcia clear ():

Zoradiť hashovaciu tabuľku

Zjavným prístupom by mohlo byť prepojenie výstupu premennej na Sort-Object:

$ farby | triedenie # nefunguje

Ako sme už videli vyššie, zadaním názvu premennej sa vráti celá hašovacia tabuľka ako jeden objekt, takže sa triedenie prvkov týmto spôsobom neočakáva.

Slovník musíte opakovať aj pre zoradenie, čím sa metóda GetEnumerator () ukáže opäť užitočnou:

$ colors.GetEnumerator () | triediť - Názov vlastníctva

V tomto príklade sú prvky zoradené podľa kľúča. Ak ich chcete namiesto toho zoradiť podľa hodnôt, vo vyššie uvedenom hovore nahradíte meno hodnotou.

Pri vytváraní hašovacej tabuľky by ste samozrejme mohli prísť s nápadom zadávať kľúče v zoradenom poradí. Avšak rýchlo sa ukáže, že PowerShell nezachováva toto triedenie a vydáva páry kľúč/hodnota v ľubovoľnom poradí.

Toto správanie je však možné vypnúť pomocou kľúčového slova [ordered] od verzie PowerShell 3.0:

Nie je však možné použiť obsadenie na prevod existujúcej hašovacej tabuľky na usporiadanú kolekciu.

Splatting: Volanie rutín pomocou tabuľky Hashtable

Bežné použitie hash tabuliek je ukladanie parametrov a ich hodnôt do nich pred ich odovzdaním cmdletu. Najmä pri rutinách cmdlet s veľkým počtom parametrov, napríklad New-ADUser, je kód zreteľne prehľadnejší.

Namiesto volania rutiny ako obvykle:

Nový-ADUser -Meno Max.Meier -GivenName Max -Priezvisko Meier -Cesta "OU = užívateľ, DC = contoso, DC = Com"

dalo by sa postupovať nasledovne:

Upozorňujeme, že pred hašovacou tabuľkou je predpona „@“, nie „$“.