about_Hash_Tables

Krátký popis

Popisuje, jak vytvářet, používat a řadit hashovací tabulky v PowerShellu.

Dlouhý popis

Hashtable, označovaná také jako slovník nebo asociativní pole, je kompaktní datová struktura, která ukládá jeden nebo více párů klíč-hodnota. Například tabulka hash může obsahovat řadu IP adres a názvů počítačů, kde IP adresy jsou klíče a názvy počítačů jsou hodnoty nebo naopak.

V PowerShellu je každá zatřiďovací tabulka objektem Hashtable[System.Collections.Hashtable] . V PowerShellu můžete použít vlastnosti a metody Hashtable objektů.

Počínaje PowerShellem 3.0 můžete pomocí atributu [ordered] vytvořit objekt v PowerShellu [System.Collections.Specialized.OrderedDictionary] .

Seřazené slovníky se liší od hashovatelných tabulek v tom, že klíče se vždy zobrazují v pořadí, ve kterém je vypíšete. Pořadí klíčů v hashovatelné tabulce není určeno.

Klíče a hodnota v hashtables jsou také objekty .NET. Nejčastěji se jedná o řetězce nebo celá čísla, ale můžou mít libovolný typ objektu. Můžete také vytvořit vnořené hashovací tabulky, ve kterých je hodnota klíče jinou hashovací tabulkou.

Hashtablečasto se používají, protože jsou efektivní pro hledání a načítání dat. K ukládání seznamů a vytváření počítaných vlastností v PowerShellu můžete použít hashovací tabulky. PowerShell má rutinu, ConvertFrom-StringDatakterá převádí řetězce na hashtable.

Syntaxe

Syntaxe hashovatelné tabulky je následující:

@{ <name> = <value>; [<name> = <value> ] ...}

Syntaxe seřazeného slovníku je následující:

[ordered]@{ <name> = <value>; [<name> = <value> ] ...}

Akcelerátor [ordered] typů byl zaveden v PowerShellu 3.0.

Vytváření hashovatelných tabulek

Pokud chcete vytvořit hashovací tabulku, postupujte podle těchto pokynů:

  • Zahajte zatřiďovací tabulku znakem@ ().
  • Uzavřete hashtable do složených závorek ({}).
  • Zadejte jeden nebo více párů klíč-hodnota pro obsah hashovatelné tabulky.
  • K oddělení každého klíče od jeho hodnoty použijte znaménko rovná se (=).
  • K oddělení párů klíč-hodnota použijte středník (;) nebo konec řádku.
  • Klíče, které obsahují mezery, musí být uzavřeny v uvozovkách. Hodnoty musí být platné výrazy PowerShellu. Řetězce se musí zobrazovat v uvozovkách, i když neobsahují mezery.
  • Pokud chcete spravovat zatřiďovací tabulku, uložte ji do proměnné.
  • Při přiřazování uspořádané hashovatelné proměnné umístěte [ordered] typ před @ symbol. Pokud ji umístíte před název proměnné, příkaz selže.

Pokud chcete vytvořit prázdnou hashovací tabulku v hodnotě $hash, zadejte:

$hash = @{}

Při vytváření můžete do hashtable přidat také klíče a hodnoty. Následující příkaz například vytvoří hashovatelnou tabulku se třemi klíči.

$hash = @{ Number = 1; Shape = "Square"; Color = "Blue"}

Vytváření uspořádaných slovníků

Uspořádaný slovník můžete vytvořit přidáním objektu OrderedDictionary typu, ale nejjednodušší způsob, jak vytvořit uspořádaný slovník, je použít [ordered] atribut.

Atribut [ordered] je zavedený v PowerShellu 3.0.

Umístěte atribut bezprostředně před symbol @.

$hash = [ordered]@{ Number = 1; Shape = "Square"; Color = "Blue"}

Uspořádané slovníky můžete používat stejným způsobem jako hashovací tabulky. Oba typy lze použít jako hodnotu parametrů, které přebírají hashtable nebo slovník (iDictionary).

Atribut nelze použít k převodu [ordered] nebo přetypování hashovatelné tabulky. Pokud před název proměnné umístíte objednaný atribut, příkaz selže s následující chybovou zprávou.

[ordered]$hash = @{}
ParserError:
Line |
   1 |  [ordered]$hash = @{}
     |  ~~~~~~~~~~~~~~
     | The ordered attribute can be specified only on a hash literal node.

Pokud chcete výraz opravit, přesuňte atribut [objednaný].

$hash = [ordered]@{}

Seřazený slovník můžete přetypovat na hashtable, ale objednaný atribut nemůžete obnovit, i když proměnnou vymažete a zadáte nové hodnoty. Pokud chcete pořadí znovu vytvořit, musíte proměnnou odebrat a znovu vytvořit.

[hashtable]$hash = [ordered]@{
  Number = 1; Shape = "Square"; Color = "Blue"}
$hash
Name                           Value
----                           -----
Color                          Blue
Shape                          Square
Number                         1

Zobrazení hashovatelných tabulek

Pokud chcete zobrazit hashovací tabulku uloženou v proměnné, zadejte název proměnné. Ve výchozím nastavení se hashtables zobrazí jako tabulka s jedním sloupcem pro klíče a jednou pro hodnoty.

$hash
Name                           Value
----                           -----
Shape                          Square
Color                          Blue
Number                         1

hashtables have Keys and Values properties. Pomocí tečky zobrazíte všechny klíče nebo všechny hodnoty.

$hash.keys
Number
Shape
Color
$hash.values
1
Square
Blue

Každý název klíče je také vlastnost hashtable a jeho hodnota je hodnota vlastnosti název klíče. K zobrazení hodnot vlastností použijte následující formát.

$hashtable.<key>
<value>

Příklad:

$hash.Number
1

$hash.Color
Blue

Hashtables mají vlastnost Count označující počet dvojic klíč-hodnota v hashtable.

$hash.count
3

tabulky hashtable nejsou matice, takže nemůžete použít celé číslo jako index do hashtable, ale k indexování do hashtable můžete použít název klíče. Pokud je klíčem řetězcová hodnota, uzavřete název klíče do uvozovek.

Příklad:

$hash["Number"]
1

Zpracování kolizí názvů vlastností

Pokud název klíče koliduje s jedním z názvů vlastností typu HashTable, můžete pro přístup k těmto vlastnostem použít vnitřní člen psbase. Pokud je keys například název klíče a chcete vrátit kolekci klíčů HashTable , použijte tuto syntaxi:

$hashtable.psbase.Keys

To platí pro jiné typy, které implementují System.Collections.IDictionary rozhraní, například OrderedDictionary.

Iterace nad klíči a hodnotami

Klíče v hashovatelné tabulce můžete iterovat, abyste hodnoty zpracovávala několika způsoby. Každý z příkladů v této části má stejný výstup. Iterují proměnnou definovanou $hash zde:

$hash = [ordered]@{ Number = 1; Shape = "Square"; Color = "Blue"}

Poznámka:

V těchto příkladech je definován jako seřazený slovník, aby se zajistilo, $hash že výstup bude vždy ve stejném pořadí. Tyto příklady fungují stejně pro normální hashtables, ale pořadí výstupu není předvídatelné.

Každý příklad vrátí zprávu pro každý klíč a jeho hodnotu:

The value of 'Number' is: 1
The value of 'Shape' is: Square
The value of 'Color' is: Blue

Tento příklad používá blok foreach k iteraci klíčů.

foreach ($Key in $hash.Keys) {
    "The value of '$Key' is: $($hash[$Key])"
}

Tento příklad se používá ForEach-Object k iteraci klíčů.

$hash.Keys | ForEach-Object {
    "The value of '$_' is: $($hash[$_])"
}

Tento příklad používá GetEnumerator metoda odeslat každý pár klíč-hodnota prostřednictvím kanálu do ForEach-Object.

$hash.GetEnumerator() | ForEach-Object {
    "The value of '$($_.Key)' is: $($_.Value)"
}

Tento příklad používá metodu GetEnumerator a ForEach k iteraci u každého páru klíč-hodnota.

$hash.GetEnumerator().ForEach({"The value of '$($_.Key)' is: $($_.Value)"})

Přidávání a odebírání klíčů a hodnot

K přidání klíčů a hodnot do hashovatelné tabulky použijte následující formát příkazu.

$hash["<key>"] = "<value>"

Pokud například chcete do hashtable přidat klíč Time s hodnotou "Now", použijte následující formát příkazu.

$hash["Time"] = "Now"

K hashovatelné tabulce můžete také přidat klíče a hodnoty pomocí Add metody objektu System.Collections.Hashtable . Metoda Add má následující syntaxi:

Add(Key, Value)

Pokud chcete například přidat Time klíč s hodnotou Now do hashtable, použijte následující formát příkazu.

$hash.Add("Time", "Now")

A můžete přidat klíče a hodnoty do hashtable pomocí operátoru sčítání (+) a přidat hashtable do existující hashtable. Například následující příkaz přidá Time klíč s hodnotou Now do hashtable v $hash proměnné.

$hash = $hash + @{Time="Now"}

Můžete také přidat hodnoty uložené v proměnných.

$t = "Today"
$now = (Get-Date)

$hash.Add($t, $now)

Operátor odčítání nemůžete použít k odebrání páru klíč-hodnota z tabulky hash, ale můžete použít metodu Remove objektu Hashtable . Metoda Remove přebírá klíč jako jeho hodnotu.

Metoda Remove má následující syntaxi:

Remove(Key)

Pokud chcete například odebrat Time=Now pár klíč-hodnota z hashtable v hodnotě $hash proměnné, zadejte:

$hash.Remove("Time")

V PowerShellu můžete použít všechny vlastnosti a metody Hashtable objektů, včetně Contains, Clear, Clonea CopyTo. Další informace o Hashtable objektech naleznete v tématu System.Collections.Hashtable.

Typy objektů v tabulkách hash

Klíče a hodnoty v hashtable můžou mít libovolný typ objektu .NET a jedna hashtable může obsahovat klíče a hodnoty více typů.

Následující příkaz vytvoří hashovací tabulku řetězců názvů procesů a hodnoty procesních objektů a uloží ji do $p proměnné.

$p = @{
    "PowerShell" = (Get-Process pwsh)
    "Notepad" = (Get-Process notepad)
}

Hashtable můžete zobrazit ve $p vlastnostech názvu klíče a pomocí vlastností názvu klíče zobrazit hodnoty.

PS> $p

Name                           Value
----                           -----
PowerShell                     System.Diagnostics.Process (pwsh)
Notepad                        System.Diagnostics.Process (notepad)

PS> $p.PowerShell

Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id ProcessName
-------  ------    -----      ----- -----   ------     -- -----------
    441      24    54196      54012   571     5.10   1788 PowerShell

PS> $p.keys | ForEach-Object {$p.$_.Handles}
774
824

Klíče v hashovatelné tabulce můžou být libovolný typ .NET. Následující příkaz přidá pár klíč-hodnota do hashtable v $p proměnné. Klíč je objekt služby , který představuje službu WinRM a hodnota je aktuální stav služby.

$p = $p + @{
    (Get-Service WinRM) = ((Get-Service WinRM).Status)
}

Nový pár klíč-hodnota můžete zobrazit a získat k němu přístup pomocí stejných metod, které používáte pro jiné páry v hashtable.

PS> $p

Name                           Value
----                           -----
PowerShell                     System.Diagnostics.Process (pwsh)
WinRM                          Running
Notepad                        System.Diagnostics.Process (Notepad)

PS> $p.keys
PowerShell

Status   Name               DisplayName
------   ----               -----------
Running  WinRM              Windows Remote Management (WS-Managem…
Notepad

Klíče a hodnoty v hashtable mohou být Hashtable také objekty. Následující příkaz přidá pár klíč-hodnota do hashtable v $p proměnné, ve které je klíč řetězec, Hash2 a hodnota je hashtable se třemi páry klíč-hodnota.

$p = $p + @{
    "Hash2"= @{a=1; b=2; c=3}
}

K novým hodnotám můžete přistupovat stejnými metodami.

PS> $p

Name                           Value
----                           -----
WinRM                          Running
Hash2                          {a, b, c}
PowerShell                     System.Diagnostics.Process (pwsh)
Notepad                        System.Diagnostics.Process (Notepad)

PS> $p.Hash2

Name                           Value
----                           -----
a                              1
b                              2
c                              3

PS> $p.Hash2.b
2

Řazení klíčů a hodnot

Položky v hashtable jsou vnitřně neuspořádané. Páry klíč-hodnota se můžou zobrazovat v jiném pořadí pokaždé, když je zobrazíte.

I když nemůžete řadit hashtable, můžete použít metodu GetEnumerator hashtables k vytvoření výčtu klíčů a hodnot a pak pomocí Sort-Object rutiny seřadit výčtové hodnoty pro zobrazení.

Například následující příkazy vyčíslí klíče a hodnoty v tabulce hash v $p proměnné a potom seřadí klíče v abecedním pořadí.

PS> $p.GetEnumerator() | Sort-Object -Property key

Name                           Value
----                           -----
Hash2                          {a, b, c}
Notepad                        System.Diagnostics.Process (Notepad)
PowerShell                     System.Diagnostics.Process (pwsh)
WinRM                          Running

Následující příkaz používá stejný postup k seřazení hodnot hash v sestupném pořadí.

PS> $p.GetEnumerator() | Sort-Object -Property Value -Descending

Name                           Value
----                           -----
PowerShell                     System.Diagnostics.Process (pwsh)
Notepad                        System.Diagnostics.Process (Notepad)
Hash2                          {a, b, c}
WinRM                          Running

Vytváření objektů z hashtables

Počínaje PowerShellem 3.0 můžete vytvořit objekt z hashtable vlastností a hodnot vlastností.

Syntaxe je následující:

[<class-name>]@{
  <property-name>=<property-value>
  <property-name>=<property-value>
}

Tato metoda funguje pouze pro třídy, které mají konstruktor, který nemá žádné parametry. Vlastnosti objektu musí být veřejné a nastavené.

Další informace najdete v tématu about_Object_Creation.

ConvertFrom-StringData

Rutina ConvertFrom-StringData převede řetězec nebo here-řetězec párů klíč-hodnota na hashtable. Rutinu ConvertFrom-StringData můžete bezpečně použít v části Data skriptu a pomocí této Import-LocalizedData rutiny můžete zobrazit uživatelské zprávy v jazykové verzi uživatelského rozhraní aktuálního uživatele.

Tady jsou řetězce zvlášť užitečné, když hodnoty v hashtable obsahují uvozovky. Další informace o tomto řetězci najdete v tématu about_Quoting_Rules.

Následující příklad ukazuje, jak vytvořit zde řetězec zpráv uživatele v předchozím příkladu a jak je použít ConvertFrom-StringData k převodu z řetězce na hashtable.

Následující příkaz vytvoří zde řetězec párů klíč-hodnota a pak ho uloží do $string proměnné.

$string = @"
Msg1 = Type "Windows".
Msg2 = She said, "Hello, World."
Msg3 = Enter an alias (or "nickname").
"@

Tento příkaz pomocí rutiny ConvertFrom-StringData převede řetězec here-string na hashtable.

ConvertFrom-StringData $string

Name                           Value
----                           -----
Msg3                           Enter an alias (or "nickname").
Msg2                           She said, "Hello, World."
Msg1                           Type "Windows".

Další informace o tomto řetězci najdete v tématu about_Quoting_Rules.

Viz také