Creați Hashtable în PowerShell, adăugați, ștergeți, sortați elemente WindowsPro
În plus față de tablouri, PowerShell acceptă un alt tip de date compuse cu tabele hash. Oferă metode de căutare, adăugare, modificare sau ștergere a perechilor cheie/valoare. Hashtables pot fi utilizate în mai multe moduri, de exemplu pentru a transmite valori parametrilor cmdlet.

Principala diferență între tablourile obișnuite și tabelele hash, care se mai numesc și tablouri asociative, este că puteți utiliza nu doar un index numeric, ci orice obiect .NET ca cheie. Hashtables constă astfel dintr-o colecție de perechi cheie/valoare.
Matrice versus hashtables
Dacă creați această matrice, de exemplu
apoi apelați al doilea element cu valoarea „alb” prin $ culori [1]. În consecință, puteți pur și simplu să iterați pe întregul câmp incrementând indexul (consultați Matrice în PowerShell: creați, modificați, citiți, sortați, ștergeți).
Hashtables, pe de altă parte, constă întotdeauna din perechi sub formă de cheie = valoare. Pentru a rămâne cu subiectul culorilor, un tabel hash ar putea arăta astfel:
Atunci când utilizați sintaxa pentru crearea unui tablou asociativ, asigurați-vă că perechile cheie/valoare sunt între paranteze cretate (cu matrici normale sunt rotunde) și separate prin punct și virgulă (cu matrici, este permisă și o virgulă). Valoarea este alocată unei chei folosind semnul egal.
Accesează elemente
Dacă doriți acum să accesați al doilea element cu valoarea „Alb”, PowerShell oferă mai multe opțiuni pentru acest lucru. Analog cu matricile cu care ați putea face acest lucru
a face. După cum puteți vedea, cheia „perete” servește ca index și nu ca valoare numerică (chiar dacă o astfel de valoare ar putea fi utilizată ca cheie).
Ca și în cazul matricelor, PowerShell permite abordarea simultană a mai multor elemente:
Alternativ, puteți utiliza notația
utilizați sau, dacă doriți să fie mai complex, utilizați funcția Get_Item:
Dacă nu obțineți niciun rezultat, atunci fie valoarea pentru această cheie $ poate fi zero, fie cheia nu există. Pentru a verifica dacă este prezent, utilizați funcția ContainsKey:
Adversarul, funcția ContainsValue (), pe de altă parte, vă informează dacă o anumită valoare este prezentă în tabel:
Ambele funcții returnează True sau False, în funcție de dacă găsesc valoarea dorită.
Dacă doriți să afișați întregul conținut al tabelului, atunci, ca de obicei în PowerShell, trebuie doar să introduceți numele variabilei. Ca și comanda
totuși, arată că obțineți întregul hashtable ca un singur obiect în acest fel.
Câte elemente conține pot fi găsite folosind numărul de proprietăți, la fel ca o matrice:
ar rezulta 4 în exemplul nostru.
Iterează peste mesele hash
În diferite ocazii, veți dori să parcurgeți întreaga colecție. Deși trebuie doar să numărați indexul pentru o matrice, aveți nevoie de o altă metodă aici.
Pe de o parte, este potrivită o buclă foreach peste toate tastele, prin care ocupă oa doua variabilă cu cheia curentă la fiecare trecere:
foreach ($ k în $ culori. Chei)
Pe de altă parte, funcția GetEnumerator () este ideală pentru această sarcină, astfel încât să puteți salva singur variabila de rulare:
Dacă doriți să găsiți toate elementele care au o anumită valoare, nu trebuie să iterați peste dicționar, un filtru cu Unde-obiect (alias "?") Face același lucru aici:
Adăugați cheie
După cum se arată în partea de sus, puteți insera perechile cheie/valoare atunci când declarați un tabel hash. De exemplu, dacă aveți un tabel hash gol
pornește sau pur și simplu dorește să adauge mai multe la cheile existente, există mai multe opțiuni pentru aceasta. Cea mai evidentă urmează aceeași sintaxă ca și declarația:
În plus, un tabel hash oferă metoda add () în acest scop:
În cele din urmă, se poate utiliza și operatorul de adăugare pentru această sarcină:
După cum puteți vedea cu ușurință, vă creați propriul tabel hash pentru noua cheie. Prin urmare, este un proces care poate fi utilizat în general pentru a combina două tablouri asociative.
Ștergeți tasta
Pentru a elimina o cheie din dicționar, PowerShell oferă metoda remove (). Aceasta înseamnă că o singură pereche poate fi ștearsă cu fiecare apel:
Lucrurile devin mai complicate atunci când doriți să iterați peste masă pentru a șterge cheile care au o anumită valoare, în exemplul următor aceasta ar fi „verde”:
Cu toate acestea, PowerShell recunoaște această procedură cu mesajul „Eroare la trecerea printr-o listă: listarea a fost modificată. Este posibil ca procesul de enumerare să nu poată fi realizat”.
Dacă doriți să evitați această reacție și să obțineți un rezultat fiabil, funcția clonă () vă ajută să obțineți o referință separată la tabel:
Dacă doriți să eliminați toate tastele, funcția clear () servește acestui scop:
Sortați tabelul hash
O abordare evidentă ar putea fi conectarea ieșirii variabilei la Sort-Object:
$ culori | sort # nu funcționează
Cu toate acestea, așa cum am văzut deja mai sus, introducerea numelui variabilei returnează întregul tabel hash ca un singur obiect, deci nu este de așteptat sortarea elementelor.
Trebuie să iterați peste dicționar și pentru sortare, prin care metoda GetEnumerator () se dovedește a fi utilă din nou:
$ colors.GetEnumerator () | sort -Nume proprietate
Acest exemplu sortează elementele după cheie. Dacă doriți să le sortați în funcție de valori, înlocuiți numele cu valoarea din apelul de mai sus.
Desigur, ai putea veni cu ideea introducerii cheilor în ordine sortată atunci când creezi tabelul hash. Cu toate acestea, devine rapid evident că PowerShell nu păstrează această sortare și transmite perechile cheie/valoare în orice ordine.
Cu toate acestea, acest comportament poate fi dezactivat utilizând cuvântul cheie [comandat] de la PowerShell 3.0:
Cu toate acestea, nu este posibil să utilizați o distribuție pentru a converti un tabel hash existent într-o colecție ordonată.
Splatting: Apelarea cmdleturilor cu un Hashtable
O utilizare obișnuită a tabelelor hash este de a stoca parametrii și valorile lor în ele înainte de a le transmite unui cmdlet. Mai ales în cazul cmdleturilor cu un număr mare de parametri, de exemplu New-ADUser, codul este clar mai clar.
În loc să apelați cmdletul ca de obicei:
New-ADUser -Name Max.Meier -GivenName Max -Surname Meier -Path "OU = user, DC = contoso, DC = Com"
s-ar putea proceda astfel:
Vă rugăm să rețineți că tabelul hash este precedat de un „@” și nu de un „$”.