about_Hash_Tables

Krótki opis

Opisuje sposób tworzenia, używania i sortowania tabel skrótów w programie PowerShell.

Długi opis

Tabela skrótów, znana również jako słownik lub tablica asocjacyjna, jest kompaktową strukturą danych, która przechowuje jedną lub więcej par klucz/wartość. Na przykład tabela skrótów może zawierać serię adresów IP i nazw komputerów, gdzie adresy IP są kluczami, a nazwy komputerów są wartościami lub odwrotnie.

W programie PowerShell każda tabela skrótów jest obiektem Hashtable (System.Collections.Hashtable). Możesz użyć właściwości i metod obiektów w formie tabeli skrótów w programie PowerShell.

Począwszy od programu PowerShell 3.0, można użyć atrybutu [ordered] do utworzenia uporządkowanego słownika (System.Collections.Specialized.OrderedDictionary) w programie PowerShell.

Uporządkowane słowniki różnią się od tabel skrótów, dlatego klucze są zawsze wyświetlane w kolejności ich wyświetlania. Kolejność kluczy w tabeli skrótów nie jest określana.

Klucze i wartość w tabelach skrótów są również obiektami platformy .NET. Są to najczęściej ciągi lub liczby całkowite, ale mogą mieć dowolny typ obiektu. Można również utworzyć zagnieżdżone tabele skrótów, w których wartość klucza jest kolejną tabelą skrótów.

Tabele skrótów są często używane, ponieważ są bardzo wydajne do znajdowania i pobierania danych. Tabele skrótów umożliwiają przechowywanie list i tworzenie właściwości obliczeniowych w programie PowerShell. Program PowerShell ma polecenie cmdlet , ConvertFrom-StringDataktóre konwertuje ciągi na tabelę skrótów.

Składnia

Składnia tabeli skrótów jest następująca:

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

Składnia uporządkowanego słownika jest następująca:

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

Atrybut [ordered] został wprowadzony w programie PowerShell 3.0.

Tworzenie tabel skrótów

Aby utworzyć tabelę skrótów, postępuj zgodnie z następującymi wytycznymi:

  • Rozpocznij tabelę skrótów przy użyciu znaku (@).
  • Należy ująć tabelę skrótów w nawiasy klamrowe ({}).
  • Wprowadź co najmniej jedną parę klucz/wartość dla zawartości tabeli skrótów.
  • Użyj znaku równości (=), aby oddzielić każdy klucz od jego wartości.
  • Użyj średnika (;) lub podziału wiersza, aby oddzielić pary klucz/wartość.
  • Klucze zawierające spacje muszą być ujęte w znaki cudzysłowu. Wartości muszą być prawidłowymi wyrażeniami programu PowerShell. Ciągi muszą być wyświetlane w cudzysłowie, nawet jeśli nie zawierają spacji.
  • Aby zarządzać tabelą skrótów, zapisz ją w zmiennej.
  • Podczas przypisywania uporządkowanej tabeli skrótów do zmiennej umieść atrybut [ordered] przed symbolem @ . Jeśli umieścisz ją przed nazwą zmiennej, polecenie zakończy się niepowodzeniem.

Aby utworzyć pustą tabelę skrótów w wartości $hash, wpisz:

$hash = @{}

Podczas tworzenia można również dodawać klucze i wartości do tabeli skrótów. Na przykład poniższa instrukcja tworzy tabelę skrótów z trzema kluczami.

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

Tworzenie uporządkowanych słowników

Uporządkowany słownik można utworzyć, dodając obiekt typu OrderedDictionary , ale najprostszym sposobem utworzenia uporządkowanego słownika jest użycie atrybutu [ordered] .

Atrybut [ordered] jest wprowadzany w programie PowerShell 3.0.

Umieść atrybut bezpośrednio przed symbolem "@".

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

Można używać uporządkowanych słowników w taki sam sposób, jak w przypadku tabel skrótów. Typ może służyć jako wartość parametrów, które przyjmują tabelę skrótów lub słownik (iDictionary).

Nie można użyć atrybutu [ordered] do konwersji lub rzutowania tabeli skrótów. Jeśli umieścisz uporządkowany atrybut przed nazwą zmiennej, polecenie zakończy się niepowodzeniem z następującym komunikatem o błędzie.

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

Aby poprawić wyrażenie, przenieś atrybut [ordered].

$hash = [ordered]@{}

Można rzutować uporządkowany słownik na tabelę skrótów, ale nie można odzyskać uporządkowanego atrybutu, nawet jeśli wyczyścisz zmienną i wprowadzisz nowe wartości. Aby ponownie ustanowić kolejność, należy usunąć i ponownie utworzyć zmienną.

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

Wyświetlanie tabel skrótów

Aby wyświetlić tabelę skrótów zapisaną w zmiennej, wpisz nazwę zmiennej. Domyślnie tabele skrótów są wyświetlane jako tabela z jedną kolumną dla kluczy i jedną dla wartości.

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

Tabele skrótów mają właściwości Klucze i Wartości. Użyj notacji kropkowej, aby wyświetlić wszystkie klucze lub wszystkie wartości.

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

Każda nazwa klucza jest również właściwością tabeli skrótów, a jej wartość jest wartością właściwości key-name. Użyj następującego formatu, aby wyświetlić wartości właściwości.

$hashtable.<key>
<value>

Przykład:

$hash.Number
1

$hash.Color
Blue

Jeśli nazwa klucza zderza się z jedną z nazw właściwości typu HashTable, możesz użyć PSBase polecenia , aby uzyskać dostęp do tych właściwości. Jeśli na przykład nazwa klucza to keys i chcesz zwrócić kolekcję Kluczy, użyj następującej składni:

$hashtable.PSBase.Keys

Tabele skrótów mają właściwość Count, która wskazuje liczbę par klucz-wartość w tabeli skrótów.

$hash.count
3

Tabele tabel skrótów nie są tablicami, więc nie można użyć liczby całkowitej jako indeksu do tabeli skrótów, ale można użyć nazwy klucza do indeksowania do tabeli skrótów. Jeśli klucz jest wartością ciągu, należy ująć nazwę klucza w cudzysłów.

Przykład:

$hash["Number"]
1

Dodawanie i usuwanie kluczy i wartości

Aby dodać klucze i wartości do tabeli skrótów, użyj następującego formatu polecenia.

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

Aby na przykład dodać klucz "Time" z wartością "Now" do tabeli skrótów, użyj następującego formatu instrukcji.

$hash["Time"] = "Now"

Możesz również dodać klucze i wartości do tabeli skrótów przy użyciu metody Add obiektu System.Collections.Hashtable. Metoda Add ma następującą składnię:

Add(Key, Value)

Aby na przykład dodać klucz "Time" z wartością "Now" do tabeli skrótów, użyj następującego formatu instrukcji.

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

Możesz również dodać klucze i wartości do tabeli skrótów przy użyciu operatora dodawania (+), aby dodać tabelę skrótów do istniejącej tabeli skrótów. Na przykład poniższa instrukcja dodaje klucz "Time" z wartością "Now" do tabeli skrótów w zmiennej $hash.

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

Możesz również dodać wartości przechowywane w zmiennych.

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

$hash.Add($t, $now)

Nie można użyć operatora odejmowania, aby usunąć parę klucz/wartość z tabeli skrótów, ale można użyć metody Remove obiektu Hashtable. Metoda Remove przyjmuje klucz jako jego wartość.

Metoda Remove ma następującą składnię:

Remove(Key)

Aby na przykład usunąć parę Time=Now klucz/wartość z tabeli skrótów w wartości zmiennej $hash, wpisz:

$hash.Remove("Time")

Można użyć wszystkich właściwości i metod obiektów hashtable w programie PowerShell, w tym Contains, Clear, Clone i CopyTo. Aby uzyskać więcej informacji na temat obiektów tabel skrótów, zobacz System.Collections.Hashtable.

Typy obiektów w tabelach skrótów

Klucze i wartości w tabeli skrótów mogą mieć dowolny typ obiektu .NET, a jedna tabela skrótów może zawierać klucze i wartości wielu typów.

Poniższa instrukcja tworzy tabelę skrótów ciągów nazw procesów i przetwarza wartości obiektów i zapisuje je w zmiennej $p .

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

Możesz wyświetlić tabelę skrótów i $p użyć właściwości key-name do wyświetlenia wartości.

$p

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

$p.PowerShell

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

$p.keys | foreach {$p.$_.handles}
441
251

Klucze w tabeli skrótów mogą być również dowolnym typem platformy .NET. Poniższa instrukcja dodaje parę klucz/wartość do tabeli skrótów w zmiennej $p . Klucz jest obiektem usługi, który reprezentuje usługę WinRM, a wartość jest bieżącym stanem usługi.

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

Możesz wyświetlać nową parę klucz/wartość i uzyskiwać do nich dostęp przy użyciu tych samych metod, które są używane dla innych par w tabeli skrótów.

$p

Name                           Value
----                           -----
PowerShell                     System.Diagnostics.Process (PowerShell)
Notepad                        System.Diagnostics.Process (notepad)
System.ServiceProcess.Servi... Running

$p.keys
PowerShell
Notepad

Status   Name               DisplayName
------   ----               -----------
Running  winrm              Windows Remote Management (WS-Manag...

$p.keys | foreach {$_.name}
winrm

Klucze i wartości w tabeli skrótów mogą być również obiektami tabel skrótów. Poniższa instrukcja dodaje parę klucz/wartość do tabeli skrótów w $p zmiennej, w której klucz jest ciągiem, hash2, a wartość jest tabelą skrótów z trzema parami klucz/wartość.

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

Nowe wartości można wyświetlać i uzyskiwać do ich dostępu przy użyciu tych samych metod.

$p

Name                           Value
----                           -----
PowerShell                     System.Diagnostics.Process (PowerShell)
Notepad                        System.Diagnostics.Process (notepad)
System.ServiceProcess.Servi... Running
Hash2                          {a, b, c}

$p.Hash2

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

$p.Hash2.b
2

Sortowanie kluczy i wartości

Elementy w tabeli skrótów są wewnętrznie nieurządkowane. Pary klucz/wartość mogą pojawiać się w innej kolejności za każdym razem, gdy są wyświetlane.

Chociaż nie można posortować tabeli skrótów, możesz użyć metody GetEnumerator tabel skrótu do wyliczenia kluczy i wartości, a następnie użyć polecenia cmdlet Sort-Object, aby posortować wyliczone wartości do wyświetlenia.

Na przykład następujące polecenia wyliczają klucze i wartości w tabeli skrótów w zmiennej $p , a następnie sortują klucze w kolejności alfabetycznej.

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

Name                           Value
----                           -----
Notepad                        System.Diagnostics.Process (notepad)
PowerShell                     System.Diagnostics.Process (PowerShell)
System.ServiceProcess.Servi... Running

Następujące polecenie używa tej samej procedury do sortowania wartości skrótu w kolejności malejącej.

$p.getenumerator() | Sort-Object -Property Value -Descending

Name                           Value
----                           -----
PowerShell                     System.Diagnostics.Process (PowerShell)
Notepad                        System.Diagnostics.Process (notepad)
System.ServiceProcess.Servi... Running

Tworzenie obiektów na podstawie tabel skrótów

Począwszy od programu PowerShell 3.0, można utworzyć obiekt na podstawie tabeli skrótów właściwości i wartości właściwości.

Składnia wygląda następująco:

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

Ta metoda działa tylko w przypadku klas, które mają konstruktor o wartości null, czyli konstruktora, który nie ma parametrów. Właściwości obiektu muszą być publiczne i ustawiane.

Aby uzyskać więcej informacji, zobacz about_Object_Creation.

ConvertFrom-StringData

Polecenie ConvertFrom-StringData cmdlet konwertuje ciąg lub ciąg here-string par klucz/wartość na tabelę skrótów. Możesz bezpiecznie użyć ConvertFrom-StringData polecenia cmdlet w sekcji Dane skryptu i użyć go z Import-LocalizedData poleceniem cmdlet do wyświetlania komunikatów użytkownika w kulturze interfejsu użytkownika bieżącego użytkownika.

Tutaj ciągi są szczególnie przydatne, gdy wartości w tabeli skrótów zawierają znaki cudzysłowu. Aby uzyskać więcej informacji na temat ciągów tutaj, zobacz about_Quoting_Rules.

W poniższym przykładzie pokazano, jak utworzyć tutaj ciąg komunikatów użytkownika w poprzednim przykładzie i jak użyć polecenia ConvertFrom-StringData , aby przekonwertować je z ciągu na tabelę skrótów.

Następujące polecenie tworzy tutaj ciąg par klucz/wartość, a następnie zapisuje go w zmiennej $string .

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

To polecenie używa ConvertFrom-StringData polecenia cmdlet do przekonwertowania here-string na tabelę skrótów.

ConvertFrom-StringData $string

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

Aby uzyskać więcej informacji na temat ciągów tutaj, zobacz about_Quoting_Rules.

Zobacz też