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-StringData
któ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żesz 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
Jeśli nazwa klucza koliduje z jedną z nazw właściwości typu HashTable, można użyć PSBase
do uzyskania dostępu 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 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
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.