Seriál Windows PowerShell: Hash tabulka (část 54.)

V PowerShellu se hash tabulka (nebudu zde používat české názvy hešovací tabulka, případně asociativní pole) používá relativně často.
Seriál Windows PowerShell: Hash tabulka (část 54.)

Existuje již od verze 1, ale časem se jednoduchost jejího použití vylepšovala. Vzhledem k tomu, že jsem v minulých dnes narazil nezávisle na její špatné použití, rozhodl jsem se, že vám dnes představím její použití.

Jak hash tabulka vypadá?

Základní použití je následující:

PS C:\> @{
>> Jmeno = 'David'
>> Prijmeni = 'Moravec'
>> }
>>

Name       Value
----       -----
Prijmeni   Moravec
Jmeno      David

Celá struktura je uzavřena mezi znaky @{ a }. Uvnitř se používá dvojice klíče a hodnoty. K určitému klíči, zde např. Jmeno se přiřazuje hodnota, David. Vyhledávání se poté provádí na základě klíče.

Všimněte si jedné vlastnosti hash tabulky. V příkladu je vidět, že jsem zadal jako první klíč Jmeno, ale ve výsledku je pořadí klíčů prohozené. Hash tabulka nezajišťuje pořadí jednotlivých položek. Ve většině případů nám to nevadí, ale v určitých scénářích bychom zachované pořadí uvítali. Jak na to, si ukážeme dále.

Zkusme si hash tabulku přiřadit do proměnné.

PS C:\> $dm = @{
>> Jmeno = 'David'
>> Prijmeni = 'Moravec'
>> Hobby = 'PowerShell'
>> Zamestnani = 'Mainstream Technologies'
>> }
>> 
PS C:\> $dm

Name         Value
----         -----
Jmeno        David
Hobby        PowerShell
Prijmeni     Moravec
Zamestnani   Mainstream Technologies

Vidíte, že použití je stejné jako u jiných datových typů. Hodnotu přiřadíme a dále použijeme. K jednotlivým položkám přistupujeme jako k vlastnostem objektu.

PS C:\> $dm.Jmeno
David
PS C:\> $dm.Zamestnani
Mainstream Technologies

Nebo pomocí „indexu“

PS C:\> $dm['Jmeno']
David
PS C:\> $dm['Zamestnani']
Mainstream Technologies

Do hash tabulky můžeme hodnoty přidávat:

PS C:\> $dm.Add('OblibenyNapoj','Kava')
PS C:\> $dm

Name            Value
----            -----
Jmeno           David
Hobby           PowerShell
Prijmeni        Moravec
Zamestnani      Mainstream Technologies
OblibenyNapoj   Kava

Nebo je mazat:

PS C:\> $dm.Remove('Zamestnani')
PS C:\> $dm

Name            Value
----            -----
Jmeno           David
Hobby           PowerShell
Prijmeni        Moravec
OblibenyNapoj   Kava

Použití

Existují zřejmě dva nejčastější způsoby použití. Při vytváření nových objektů a pro shromažďování informací. Při vytváření nových objektů se používá následujícím způsobem.

PS C:\> New-Object -TypeName PSObject -Property @{Jmeno='david';Prijmeni='moravec'}

Prijmeni  Jmeno
--------  -----
moravec   david

Stejně bychom mohli použít již existující hash tabulku.

PS C:\> New-Object -TypeName PSObject -Property $dm

Jmeno   Hobby        Prijmeni   OblibenyNapoj
-----   -----        --------   -------------
David   PowerShell   Moravec    Kava

Nyní si ukážeme, jak zajistit to, abychom vlastnosti měli v určeném pořadí. Jak jsem již říkal, v některých případech nám nejednoznačnost nevadí, ale zrovna v případě vytváření objektů se nám jasné pořadí vlastností hodí. Ve starších verzích PowerShellu jste museli použít následující trik:

PS C:\> New-Object -TypeName PSObject -Property $dm | Select-Object Jmeno, Prijmeni, Hobby, OblibenyNapoj

Jmeno   Prijmeni   Hobby        OblibenyNapoj
-----   --------   -----        -------------
David   Moravec    PowerShell   Kava

Po vytvoření objektu si zajistíme pořadí vlastností voláním cmdletu Select-Object. Od PowerShellu v3 můžeme použít tzv. setříděnou hash tabulku.

PS C:\> $dm2 = [ordered]@{
>> Jmeno = 'David'
>> Prijmeni = 'Moravec'
>> Hobby = 'PowerShell'
>> Zamestnani = 'Mainstream Technologies'
>> }
>> 
PS C:\> $dm2

Name         Value
----         -----
Jmeno        David
Prijmeni     Moravec
Hobby        PowerShell
Zamestnani   Mainstream Technologies

Všimněte si rozdílu ve výstupu, vše je zapsáno tak, jak jsme chtěli. Nyní si můžeme vyrobit nový objekt.

PS C:\> New-Object -TypeName PSObject -Property $dm2

Jmeno   Prijmeni   Hobby        Zamestnani
-----   --------   -----        ----------
David   Moravec    PowerShell   Mainstream Technologies

Nyní si ukážeme další použití hash tabulky. V určitých případech se nám hodí, že hash tabulka má pouze jediný klíč, ke kterému můžeme přiřazovat hodnoty. Nejčastějším použitím je vytváření různých statistik.

PS C:\> $h=@{}
PS C:\> cd Temp
PS C:\Temp> ls|%{$h[$_.Extension]=$h[$_.Extension]+1}
PS C:\Temp> $h

Name      Value
----      -----
.hta      1
.cmd      3
.PML      1
.png      15
.xsd      1
.html     4
.xml      12
.pssc     1
.clixml   1
.csv      12
.ps1      9

… zkráceno

Dokážete odhadnout, co jsme právě vyrobili? Nejprve jsme provedli výpis obsahu adresáře (poté, co jsme vytvořili prázdnou hash tabulku) a poté jsme do hash tabulky pro každý soubor uložili jeho příponu a ve výsledku spočítali celkový výskyt souborů určitého typu. Nyní můžeme výsledky dále zpracovat.

PS C:\Temp> $h | sort Value

Name    Value
----    -----
.hta    1
.cmd    3
.PML    1
.png    15
.xsd    1
.html   4
.xml    12

…zkráceno

Vidíme, že standardním způsobem se nám třídění nepodařilo. Pro správné setřídění musíme použít metodu GetEnumerator, která nám zajistí přístup k jednotlivým položkám tak, jak očekává cmdlet Sort-Object.

PS C:\Temp> $h.GetEnumerator() | sort Value –Descending

Name    Value
----    -----
        19
.png    15
.csv    12
.xml    12
.ps1    9
.txt    8
.exe    6
.html   4

Nyní vidíme, že třídění proběhlo již podle předpokladů. Pokud by vás zajímalo více informací k hash tabulkám, můžete se podívat do velice pěkně zpracované nápovědy about_Hash_Tables.

David Moravec, MVP
Mainstream Technologies

Články ze série Microsoft TechNet nevytváří redakce Živě.cz, ale partneři programu Microsoft TechNet. Jsou publikovány v rámci mediálního partnerství Živě.cz a společnosti Microsoft.

Diskuze (2) Další článek: Zotac chystá herní Steam Machine s čipy Intel Skylake

Témata článku: Microsoft, Programování, Web, PowerShell, Určitý případ, Tab, Tabulka, Windows +, Tempo, Nový objekt, Window, DM, PS 2, Standardní způsob, HTA, Nejčastější způsob, Win +, David, MVP, Základní použití, Windows PowerShell, Hash, Určitý objekt, Seriál, David Moravec


Určitě si přečtěte

Vybíráme nejlepší monitory: Od úplně levných až po displeje na rozmazlování očí

Vybíráme nejlepší monitory: Od úplně levných až po displeje na rozmazlování očí

** Vybrali jsme nejlepší monitory na práci i pořádné hraní ** Nejlevnější monitor s kvalitním panelem nestojí ani tři tisíce ** Rozlišení 4K a větší obrazovka už není nedostupný luxus

David Polesný | 31

David Polesný
Monitory
Dostali jste nový počítač? Tohle s ním udělejte, než ho začnete používat

Dostali jste nový počítač? Tohle s ním udělejte, než ho začnete používat

** Každý nový počítač si zaslouží počáteční péči ** Odinstalujte bloatware a nezapomeňte na vhodné nastavení ** Poradíme, jak se o počítač s Windows 10 postarat

David Polesný, Stanislav Janů | 75

David PolesnýStanislav Janů
PočítačeNotebooky
Vážně dnes ještě někdo krade Adobe? Video můžete stříhat zdarma v Resolve a fotky i vektory zvládne Affinity

Vážně dnes ještě někdo krade Adobe? Video můžete stříhat zdarma v Resolve a fotky i vektory zvládne Affinity

** Kde jsou ty doby, kdy měl skoro každý doma Photoshop ** Photoshop a Premiere Pro od kamaráda nebo z warezu ** Dnes už to nemá smysl, existuje totiž hromada laciných alternativ

Jakub Čížek | 92

Jakub Čížek
Grafický editorStřih videa
Lépe bylo bez Googlu, přiznal s odstupem bývalý šéf Waze
Markéta Mikešová
WazeGoogle
Cableporn: Podívejte se na úžasná díla umělců z podnikových serveroven

Cableporn: Podívejte se na úžasná díla umělců z podnikových serveroven

** Uspořádání kabelů můžete vnímat i jako podivný druh umění ** To nejkrásnější se skrývá v datacentrech a serverovnách ** Podívejte se na skutečné „cableporn“ z optiky i kroucené dvojlinky

Vojtěch Malý | 53

Vojtěch Malý
DatacentraServery
Avast Omni: Krabička, která vám hackne síť a promění se v unikátní antivirus

Avast Omni: Krabička, která vám hackne síť a promění se v unikátní antivirus

** Počítač dnes ochrání kdejaký antivirus ** Drobná krabička Omni se postará rovnou o celou domácí síť ** Bude ji odposlouchávat, analyzovat a blokovat útoky

Jakub Čížek | 120

Jakub Čížek
AntivirusIoT
Vodafonu se zhroutila kabelovka. Síť bývalého UPC má výpadky
Lukáš Václavík
VodafoneUPC
Technici nestíhají. Cetin dočasně přerušil zavádění VDSL bondingu
Lukáš Václavík
CETINPřipojení k internetu