Hashtable létrehozása a PowerShellben, elemek hozzáadása, törlése, rendezése a WindowsPro-ban
A tömbök mellett a PowerShell egy másik összetett adattípust is támogat hash táblákkal. Módszereket kínál kulcs/érték párok felkutatásához, hozzáadásához, módosításához vagy törléséhez. A hashtable-ok sokféleképpen használhatók, például értékek átadására a parancsmag paramétereire.

A közönséges tömbök és a hash táblák között, amelyeket asszociatív tömböknek is neveznek, az a fő különbség, hogy nemcsak numerikus indexet, hanem bármilyen .NET objektumot is használhat kulcsként. A hashtable-ek tehát kulcs/érték párok gyűjteményéből állnak.
Tömbök és hashtable-k
Ha például létrehozza ezt a tömböt
akkor a $ white [1] segítségével meghívja a második elemet „fehér” értékkel. Ennek megfelelően egyszerűen megismételheti az egész mezőt az index növelésével (lásd: Tömbök a PowerShellben: létrehozás, módosítás, felolvasás, rendezés, törlés).
A hashtable-ek viszont mindig párokból állnak a kulcs = érték formában. A színek témája mellett egy hash-táblázat így nézhet ki:
Az asszociatív tömb létrehozásának szintaxisával ellenőrizze, hogy a kulcs/érték párok göndör zárójelben vannak-e (normál tömböknél kerekek) és pontosvesszővel elválasztva (tömbökkel vessző is megengedett). Az értéket egy kulcshoz rendelik az egyenlőségjel használatával.
Hozzáférés az elemekhez
Ha most a második elemhez szeretne hozzáférni "White" értékkel, akkor a PowerShell erre több lehetőséget kínál. A tömbökhöz hasonlóan ezt megteheti
csinálni. Amint láthatja, itt a "fal" kulcsot használják indexként, és nem numerikus értékként (még akkor is, ha egy ilyen érték könnyen használható kulcsként).
A tömbökhöz hasonlóan a PowerShell is lehetővé teszi több elem egyszerre történő címzését:
Alternatív megoldásként használhatja a jelölést
használja, vagy ha azt szeretné, hogy bonyolultabb legyen, használja a Get_Item függvényt:
Ha nem kap eredményt, akkor ennek a $ kulcsnak az értéke nulla lehet, vagy a kulcs nem létezik. Ellenőrizze, hogy van-e, használja a ContainsKey funkciót:
Az ellenfél, a ContainsValue () függvény viszont tájékoztatja, hogy van-e egy bizonyos érték a táblázatban:
Mindkét függvény igaz vagy hamis eredményt ad, attól függően, hogy megtalálják-e a kívánt értéket.
Ha a táblázat teljes tartalmát ki akarja adni, akkor a PowerShellben megszokott módon elegendő megadni a változó nevét. Mint a parancs
azonban azt mutatja, hogy az egész hashtable-t egyetlen objektumként kapja meg így.
Hány elemet tartalmaz, meg lehet tudni a tulajdonságok számával, akárcsak egy tömb:
példánkban 4-et nyomtatna.
A hash-táblák felett iterál
Különböző alkalmakkor érdemes áttekinteni a teljes gyűjteményt. Bár csak egy tömb indexét kell összeszámolnia, itt más módszerre van szükség.
Egyrészt alkalmas egy foreach hurok az összes kulcsra, ahol minden váltásnál egy második változót foglal el az aktuális kulccsal:
foreach ($ k $ színben. Kulcsok)
Másrészt a GetEnumerator () függvény ideális ehhez a feladathoz, így elmentheti magának a futtatható változót:
Ha meg szeretné találni az összes olyan elemet, amely rendelkezik bizonyos értékkel, akkor nem kell átdolgoznia a szótárat, egy szűrőt a Where-Object (alias "?") Néven.
Kulcs hozzáadása
A legtetején látható módon beillesztheti a kulcs/érték párokat a hash tábla deklarálásakor. Például, ha üres hash táblája van
elindítja vagy egyszerűen csak többet akar hozzáadni a meglévő kulcsokhoz, erre több lehetőség is van. A legnyilvánvalóbb ugyanaz a szintaxis, mint a deklaráció:
Ezenkívül egy hash tábla biztosítja az add () metódust erre a célra:
Végül az addíciós operátort is használhatjuk erre a feladatra:
Amint könnyen láthatja, létrehozza saját hash tábláját az új kulcs számára. Ezért ez egy olyan folyamat, amelyet általában két asszociatív tömb kombinálására lehet használni.
Törlés gomb
Kulcs eltávolításához a szótárból a PowerShell biztosítja az remove () metódust. Ez azt jelenti, hogy minden hívásnál csak egy pár törölhető:
A dolgok bonyolultabbá válnak, ha a táblázat fölé akarunk ismételni egy bizonyos értékű kulcsok törléséhez, a következő példában ez "zöld" lenne:
A PowerShell azonban ezt az eljárást a "Hiba történt egy lista végrehajtása közben: A lista megváltozott. Előfordulhat, hogy a felsorolási folyamat nem hajtható végre" üzenetgel.
Ha el akarja kerülni ezt a reakciót és megbízható eredményt szeretne elérni, akkor a clone () függvény segít külön hivatkozást kapni a táblázatra:
Ha el akarja távolítani az összes kulcsot, a clear () függvény ezt a célt szolgálja:
Rendezés hash tábla
Nyilvánvaló megközelítés lehet a változó kimenetének átvitele a Sort-Object-re:
$ színek | a sort # nem működik
Amint azt a fentiekben láthattuk, a változó név beírása a teljes hash táblát egy objektumként adja vissza, így az elemek rendezése nem várható ilyen módon.
A válogatáshoz is meg kell ismételni a szótárat, ezáltal a GetEnumerator () módszer ismét hasznosnak bizonyul:
$ színek.GetEnumerator () | sort -Tulajdon neve
Ez a példa kulcsok szerint rendezi az elemeket. Ha ehelyett az értékek szerint szeretné rendezni őket, akkor a fenti hívásban a nevet értékre cseréli.
Természetesen felmerülhet a kulcsok rendezett sorrendbe történő beírása a hash tábla létrehozásakor. Azonban gyorsan nyilvánvalóvá válik, hogy a PowerShell nem tartja ezt a válogatást, és a kulcs/érték párokat bármilyen sorrendben adja ki.
Ez a viselkedés azonban kikapcsolható a [rendezett] kulcsszó használatával a PowerShell 3.0 óta:
Azonban nem lehet cast-ot használni egy meglévő hash-tábla rendezett gyűjteménygé alakításához.
Fröccs: parancsmagok hívása hashtable-vel
A hash táblák általánosan használt eleme a paraméterek és értékeik tárolása bennük, mielőtt átadnák őket egy parancsmagnak. Különösen a nagy számú paraméterrel rendelkező parancsmagoknál (például New-ADUser) a kód egyértelműbb.
Ahelyett, hogy a parancsmagot a szokásos módon hívná:
New-ADUser -Név Max.Meier -GivenName Max -Vezetéknév Meier -Path "OU = felhasználó, DC = contoso, DC = Com"
az alábbiak szerint folytathatnánk:
Felhívjuk figyelmét, hogy a hash táblázatot '@' és nem '$' jelzi.