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żna użyć właściwości i metod Hashtable obiektów w programie PowerShell.
Począwszy od programu PowerShell 3.0, można użyć atrybutu [ordered]
do utworzenia [System.Collections.Specialized.OrderedDictionary]
obiektu 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.
Hashtablesą często używane, ponieważ są 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ótu jest następująca:
@{ <name> = <value>; [<name> = <value> ] ...}
Składnia uporządkowanego słownika jest następująca:
[ordered]@{ <name> = <value>; [<name> = <value> ] ...}
Akcelerator [ordered]
typów 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 należy umieścić
[ordered]
typ 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
Można utworzyć uporządkowany słownik, dodając obiekt OrderedDictionary typu, 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 używania tabel skrótów. Można użyć dowolnego typu jako wartości parametrów, które przyjmują tabelę skrótów lub słownik (iDictionary).
Nie można użyć atrybutu [ordered]
do konwersji ani 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ą 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 nazwa klucza. 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 tabeli 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.
Na przykład:
$hash["Number"]
1
Obsługa kolizji nazw właściwości
Jeśli nazwa klucza zderza się 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ą System.Collections.IDictionary interfejs, na przykład OrderedDictionary.
Iterowanie kluczy i wartości
Możesz wykonać iterację kluczy w tabeli skrótów, aby przetworzyć wartości na kilka sposobów. Każdy z przykładów w tej sekcji ma identyczne dane wyjściowe. Iterują one po zmiennej zdefiniowanej $hash
tutaj:
$hash = [ordered]@{ Number = 1; Shape = "Square"; Color = "Blue"}
Uwaga
W tych przykładach jest definiowany 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 , aby wysłać każdą parę klucz-wartość za pośrednictwem potoku do ForEach-Object
metody .
$hash.GetEnumerator() | ForEach-Object {
"The value of '$($_.Key)' is: $($_.Value)"
}
W tym przykładzie użyto metod GetEnumerator i ForEach do iteracji poszczególnych par 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 System.Collections.Hashtable przy użyciu Add
metody obiektu . Metoda Add
ma następującą składnię:
Add(Key, Value)
Aby na przykład dodać Time
klucz z wartością do tabeli skrótów Now
, 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 Time
klucz 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 Hashtable , ale możesz użyć metody Remove obiektu. Metoda Remove przyjmuje klucz jako jego wartość.
Metoda Remove
ma następującą składnię:
Remove(Key)
Aby na przykład usunąć Time=Now
parę 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 Hashtable obiektów w programie PowerShell, w tym Contains
, Clear
, Clone
i CopyTo
. Aby uzyskać więcej informacji na temat Hashtable obiektó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 w $p
pliku i użyć właściwości key-name do wyświetlenia wartości.
PS> $p
Name Value
---- -----
PowerShell System.Diagnostics.Process (PowerShell)
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}
441
251
Klucze w tabeli skrótów mogą być 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świetlić i uzyskać 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.
PS> $p
Name Value
---- -----
PowerShell System.Diagnostics.Process (PowerShell)
Notepad System.Diagnostics.Process (notepad)
System.ServiceProcess.Servi... Running
PS> $p.keys
PowerShell
Notepad
Status Name DisplayName
------ ---- -----------
Running winrm Windows Remote Management (WS-Manag...
PS> $p.keys | ForEach-Object {$_.name}
WinRM
Klucze i wartości w tabeli skrótu mogą być Hashtable również obiektami. Poniższa instrukcja dodaje parę klucz-wartość do tabeli skrótu 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.
PS> $p
Name Value
---- -----
PowerShell System.Diagnostics.Process (pwsh)
Hash2 {[b, 2], [c, 3], [a, 1]}
WinRM Running
Notepad System.Diagnostics.Process (Notepad)
PS> $p.Hash2
Name Value
---- -----
b 2
c 3
a 1
PS> $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ótu, możesz użyć metody GetEnumerator tabel skrótów, aby wyliczyć klucze i wartości, a następnie użyć Sort-Object
polecenia cmdlet 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.
PS> $p.GetEnumerator() | Sort-Object -Property key
Name Value
---- -----
Hash2 {[b, 2], [c, 3], [a, 1]}
Notepad System.Diagnostics.Process (Notepad)
PowerShell System.Diagnostics.Process (pwsh)
WinRM Running
Poniższe polecenie używa tej samej procedury do sortowania wartości skrótów w kolejności malejącej.
PS> $p.GetEnumerator() | Sort-Object -Property Value -Descending
Name Value
---- -----
PowerShell System.Diagnostics.Process (pwsh)
Notepad System.Diagnostics.Process (Notepad)
Hash2 {[b, 2], [c, 3], [a, 1]}
WinRM Running
Tworzenie obiektów na podstawie tabel skrótów
Począwszy od programu PowerShell 3.0, można utworzyć obiekt na podstawie skrótu 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, 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 tutaj pary klucz-wartość na tabelę skrótową. 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ótu 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 przekonwertować ConvertFrom-StringData
je z ciągu na wartość skrótową.
Następujące polecenie tworzy ciąg here-value 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.