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, to kompaktowa struktura danych, która przechowuje co najmniej jedną 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). W programie PowerShell można użyć właściwości i metod obiektów w formie skrótu.

Począwszy od programu PowerShell 3.0, można użyć atrybutu [uporządkowane] 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 w tym, że 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 inną 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 [zamówiony] 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 z znakiem (@).
  • Załącz tabelę skrótów w nawiasach klamrowych ({}).
  • 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 cudzysłów. 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 [uporządkowany] 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 = @{}

Klucze i wartości można również dodać do tabeli skrótów podczas jej tworzenia. 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

Można utworzyć uporządkowany słownik, 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żesz użyć uporządkowanych słowników w taki sam sposób, jak w przypadku tabel skrótów. Typ może być używany jako wartość parametrów, które przyjmują tabelę skrótu lub słownik (iDictionary).

Nie można użyć atrybutu [ordered] do konwertowania 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 [uporządkowany].

$hash = [ordered]@{}

Możesz rzutować uporządkowany słownik do tabeli skrótów, ale nie można odzyskać uporządkowanego atrybutu, nawet jeśli wyczyszczysz 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>

Na przykład:

$hash.Number
1

$hash.Color
Blue

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 w tabeli skrótów. Jeśli klucz jest wartością ciągu, należy ująć nazwę klucza w cudzysłów.

Na przykład:

$hash["Number"]
1

Obsługa kolizji nazw właściwości

Jeśli nazwa klucza koliduje z jedną z nazw właściwości typu HashTable, możesz użyć wewnętrznego elementu członkowskiegopsbase, 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 HashTable , użyj następującej składni:

$hashtable.psbase.Keys

Dotyczy to innych typów, które implementują interfejs System.Collections.IDictionary , taki jak OrderedDictionary.

Iterowanie nad kluczami i wartościami

Możesz iterować klucze w tabeli skrótów, aby przetwarzać wartości na kilka sposobów. Każdy z przykładów w tej sekcji ma identyczne dane wyjściowe. Iterują zmienną zdefiniowaną $hash tutaj:

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

Uwaga

W tych przykładach zdefiniowano jako uporządkowany słownik, aby zapewnić, $hash że dane wyjściowe są zawsze w tej samej kolejności. Te przykłady działają tak samo w przypadku normalnych tabel skrótów, ale kolejność danych wyjściowych nie jest przewidywalna.

Każdy przykład zwraca komunikat dla każdego klucza i jego wartości:

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

W tym przykładzie użyto bloku foreach do iterowania kluczy.

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

W tym przykładzie użyto ForEach-Object metody do iteracji kluczy.

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

W tym przykładzie użyto metody GetEnumerator do wysyłania każdej pary klucz-wartość za pośrednictwem potoku do ForEach-Objectmetody .

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

W tym przykładzie użyto metod GetEnumerator i ForEach do iteracji dla każdej pary klucz-wartość.

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

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żesz użyć wszystkich właściwości i metod obiektów hashtable w programie PowerShell, w tym Zawiera, Clear, Clone i CopyTo. Aby uzyskać więcej informacji na temat obiektów w formie skrótu, 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 pojedyncza 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 procesu i wartości obiektów przetwarzania i zapisuje ją 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, aby wyświetlić 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ć i uzyskiwać dostęp do nowej pary klucz/wartość 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ótu z trzema parami klucz/wartość.

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

Możesz wyświetlać i uzyskiwać dostęp do nowych wartości 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 je wyświetlisz.

Chociaż nie można posortować tabeli skrótów, możesz użyć metody GetEnumerator tabel skrótów do wyliczenia kluczy i wartości, a następnie użyć polecenia cmdlet Sort-Object do sortowania wyliczonych 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

Poniższe polecenie używa tej samej procedury do sortowania wartości skrótów 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 tutaj ciąg 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 ich używać ConvertFrom-StringData do konwertowania ich z ciągu na tabelę skrótów.

Następujące polecenie tworzy tutaj ciąg par klucz/wartość, a następnie zapisuje je 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, aby przekonwertować ciąg 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ż