Informacje o tabelach skrótówAbout Hash Tables

KRÓTKI OPISSHORT DESCRIPTION

Opisuje sposób tworzenia, używania i sortowania tabel skrótów w programie PowerShell.Describes how to create, use, and sort hash tables in PowerShell.

DŁUGI OPISLONG DESCRIPTION

Tablica skrótów, znana również jako słownik lub tablica asocjacyjna, jest zwartą strukturą danych, która przechowuje jeden lub więcej par klucz/wartość.A hash table, also known as a dictionary or associative array, is a compact data structure that stores one or more key/value pairs. 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 na odwrót.For example, a hash table might contain a series of IP addresses and computer names, where the IP addresses are the keys and the computer names are the values, or vice versa.

W programie PowerShell każda tabela skrótów jest obiektem Hashtable (System. Collections. Hashtable).In PowerShell, each hash table is a Hashtable (System.Collections.Hashtable) object. Można użyć właściwości i metod obiektów Hashtable w programie PowerShell.You can use the properties and methods of Hashtable objects in PowerShell.

Począwszy od programu PowerShell 3,0, można użyć atrybutu [orderd] do tworzenia uporządkowanego słownika (System. Collections. wyspecjalizowany. OrderedDictionary) w programie PowerShell.Beginning in PowerShell 3.0, you can use the [ordered] attribute to create an ordered dictionary (System.Collections.Specialized.OrderedDictionary) in PowerShell.

Słowniki uporządkowane różnią się od tabel skrótów, ponieważ klucze zawsze pojawiają się w kolejności, w jakiej są wyświetlane.Ordered dictionaries differ from hash tables in that the keys always appear in the order in which you list them. Nie określono kolejności kluczy w tabeli skrótów.The order of keys in a hash table is not determined.

Klucze i wartość w tabelach skrótów są również obiektami platformy .NET.The keys and value in hash tables are also .NET objects. Najczęściej są to ciągi lub liczby całkowite, ale mogą mieć dowolny typ obiektu.They are most often strings or integers, but they can have any object type. Można również tworzyć zagnieżdżone tabele skrótów, w których wartość klucza jest kolejną tabelą skrótów.You can also create nested hash tables, in which the value of a key is another hash table.

Tabele skrótów są często używane, ponieważ są bardzo wydajne do znajdowania i pobierania danych.Hash tables are frequently used because they are very efficient for finding and retrieving data. Za pomocą tabel skrótów można przechowywać listy i tworzyć właściwości obliczeniowe w programie PowerShell.You can use hash tables to store lists and to create calculated properties in PowerShell. Ponadto program PowerShell ma polecenie cmdlet, ConvertFrom-StringData, które konwertuje ciągi na tablicę skrótów.And, PowerShell has a cmdlet, ConvertFrom-StringData, that converts strings to a hash table.

SkładniaSyntax

Składnia tabeli skrótów jest następująca:The syntax of a hash table is as follows:

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

Składnia uporządkowanego słownika jest następująca:The syntax of an ordered dictionary is as follows:

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

Atrybut [orderd] został wprowadzony w programie PowerShell 3,0.The [ordered] attribute was introduced in PowerShell 3.0.

Tworzenie tabel skrótówCreating Hash Tables

Aby utworzyć tablicę skrótów, postępuj zgodnie z następującymi wskazówkami:To create a hash table, follow these guidelines:

  • Rozpocznij tablicę skrótów za pomocą znaku (@).Begin the hash table with an at sign (@).
  • Ujmij tablicę skrótów w nawiasy klamrowe ( {} ).Enclose the hash table in braces ({}).
  • Wprowadź co najmniej jedną parę klucz/wartość dla zawartości tabeli skrótów.Enter one or more key/value pairs for the content of the hash table.
  • Użyj znaku równości (=), aby oddzielić każdy klucz od jego wartości.Use an equal sign (=) to separate each key from its value.
  • Użyj średnika (;) lub podział wiersza, aby oddzielić pary klucz/wartość.Use a semicolon (;) or a line break to separate the key/value pairs.
  • Klucz zawierający spacje musi być ujęty w cudzysłów.Key that contains spaces must be enclosed in quotation marks. Wartości muszą być prawidłowymi wyrażeniami programu PowerShell.Values must be valid PowerShell expressions. Ciągi muszą występować w cudzysłowie, nawet jeśli nie zawierają spacji.Strings must appear in quotation marks, even if they do not include spaces.
  • Aby zarządzać tabelą skrótów, Zapisz ją w zmiennej.To manage the hash table, save it in a variable.
  • Podczas przypisywania uporządkowanej tabeli skrótów do zmiennej Umieść atrybut [orderd] przed symbolem "@".</span><span class="sxs-lookup">When assigning an ordered hash table to a variable, place the [ordered] attribute before the "@" symbol.</span></span> <span data-ttu-id="97233-137">Jeśli umieścisz ją przed nazwą zmiennej, polecenie zakończy się niepowodzeniem.If you place it before the variable name, the command fails.

Aby utworzyć pustą tablicę skrótów w wartości $hash, wpisz:To create an empty hash table in the value of $hash, type:

$hash = @{}

Podczas tworzenia można także dodawać klucze i wartości do tabeli skrótów.You can also add keys and values to a hash table when you create it. Na przykład poniższa instrukcja tworzy tablicę skrótów z trzema kluczami.For example, the following statement creates a hash table with three keys.

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

Tworzenie uporządkowanych słownikówCreating Ordered Dictionaries

Można utworzyć uporządkowany słownik poprzez dodanie obiektu typu OrderedDictionary, ale Najprostszym sposobem tworzenia słownika uporządkowanego jest użycie atrybutu [orderd].You can create an ordered dictionary by adding an object of the OrderedDictionary type, but the easiest way to create an ordered dictionary is use the [Ordered] attribute.

Atrybut [orderd] jest wprowadzany w programie PowerShell 3,0.The [ordered] attribute is introduced in PowerShell 3.0.

Umieść atrybut bezpośrednio przed symbolem "@".</span><span class="sxs-lookup">Place the attribute immediately before the "@" symbol.

$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.You can use ordered dictionaries in the same way that you use hash tables. Można użyć dowolnego typu jako wartości parametrów, które przyjmują tabelę lub słownik wartości skrótu (iDictionary).Either type can be used as the value of parameters that take a hash table or dictionary (iDictionary).

Nie można użyć atrybutu [orderd] do konwersji lub rzutowania tabeli skrótów.You cannot use the [ordered] attribute to convert or cast a hash table. Jeśli umieścisz atrybut uporządkowany przed nazwą zmiennej, polecenie zakończy się niepowodzeniem z następującym komunikatem o błędzie.If you place the ordered attribute before the variable name, the command fails with the following error message.

PS C:\> [ordered]$hash = @{}
At line:1 char:1
+ [ordered]$hash = @{}
+ [!INCLUDE[]()]
The ordered attribute can be specified only on a hash literal node.
+ CategoryInfo          : ParserError: (:) [], ParentContainsErrorRecordExc
eption
+ FullyQualifiedErrorId : OrderedAttributeOnlyOnHashLiteralNode

Aby poprawić wyrażenie, Przenieś atrybut [uporządkowane].To correct the expression, move the [ordered] attribute.

PS C:\> $hash = [ordered]@{}

Można rzutować uporządkowany słownik na tablicę skrótów, ale nie można odzyskać atrybutu uporządkowanego, nawet jeśli wyczyścisz zmienną i wprowadzisz nowe wartości.You can cast an ordered dictionary to a hash table, but you cannot recover the ordered attribute, even if you clear the variable and enter new values. Aby ponownie ustalić kolejność, należy usunąć i ponownie utworzyć zmienną.To re-establish the order, you must remove and recreate the variable.

PS C:\> [hashtable]$hash = [ordered]@{
>> Number = 1; Shape = "Square"; Color = "Blue"}
PS C:\> $hash

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

Wyświetlanie tabel skrótówDisplaying Hash Tables

Aby wyświetlić tablicę skrótów, która jest zapisywana w zmiennej, wpisz nazwę zmiennej.To display a hash table that is saved in a variable, type the variable name. Domyślnie tabele skrótów są wyświetlane jako tabela z jedną kolumną dla kluczy i jeden dla wartości.By default, a hash tables is displayed as a table with one column for keys and one for values.

C:\PS> $hash

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

Tabele skrótów mają właściwości kluczy i wartości.Hash tables have Keys and Values properties. Użyj notacji kropka, aby wyświetlić wszystkie klucze lub wszystkie wartości.Use dot notation to display all of the keys or all of the values.

C:\PS> $hash.keys
Number
Shape
Color

C:\PS> $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.Each key name is also a property of the hash table, and its value is the value of the key-name property. Użyj następującego formatu, aby wyświetlić wartości właściwości.Use the following format to display the property values.

$hashtable.<key>
<value>

Na przykład:For example:

C:\PS> $hash.Number
1

C:\PS> $hash.Color
Blue

Jeśli nazwa klucza koliduje z jedną z nazw właściwości typu HashTable, można użyć, PSBase Aby uzyskać dostęp do tych właściwości.If the key name collides with one of the property names of the HashTable type, you can use PSBase to access those properties. Na przykład jeśli nazwa klucza jest keys i chcesz zwrócić kolekcję kluczy, użyj następującej składni:For example, if the key name is keys and you want to return the collection of Keys, use this syntax:

$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 tables have a Count property that indicates the number of key-value pairs in the hash table.

C:\PS> $hash.count
3

Tabele tabeli skrótów nie są tablicami, więc nie można użyć liczby całkowitej jako indeksu w tabeli skrótów, ale można użyć nazwy klucza do indeksowania w tabeli skrótów.Hash table tables are not arrays, so you cannot use an integer as an index into the hash table, but you can use a key name to index into the hash table. Jeśli klucz jest wartością ciągu, ujmij nazwę klucza w cudzysłów.If the key is a string value, enclose the key name in quotation marks.

Na przykład:For example:

C:\PS> $hash["Number"]
1

Dodawanie i usuwanie kluczy i wartościAdding and Removing Keys and Values

Aby dodać klucze i wartości do tabeli skrótów, użyj następującego formatu polecenia.To add keys and values to a hash table, use the following command format.

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

Na przykład, aby dodać klucz "czas" z wartością "teraz" do tabeli skrótów, użyj następującego formatu instrukcji.For example, to add a "Time" key with a value of "Now" to the hash table, use the following statement format.

$hash["Time"] = "Now"

Możesz również dodać klucze i wartości do tabeli skrótów za pomocą metody Add obiektu System. Collections. Hashtable.You can also add keys and values to a hash table by using the Add method of the System.Collections.Hashtable object. Metoda Add ma następującą składnię:The Add method has the following syntax:

Add(Key, Value)

Na przykład, aby dodać klucz "czas" z wartością "teraz" do tabeli skrótów, użyj następującego formatu instrukcji.For example, to add a "Time" key with a value of "Now" to the hash table, use the following statement format.

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

I można dodać klucze i wartości do tabeli skrótów za pomocą operatora dodawania (+), aby dodać tabelę skrótów do istniejącej tabeli skrótów.And, you can add keys and values to a hash table by using the addition operator (+) to add a hash table to an existing hash table. Na przykład poniższa instrukcja dodaje klucz "Time" z wartością "Now" do tabeli skrótów w zmiennej $hash.For example, the following statement adds a "Time" key with a value of "Now" to the hash table in the $hash variable.

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

Można również dodawać wartości, które są przechowywane w zmiennych.You can also add values that are stored in variables.

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

$hash.Add($t, $now)

Nie można użyć operatora odejmowania do usunięcia pary klucz/wartość z tabeli skrótów, ale można użyć metody Remove obiektu Hashtable.You cannot use a subtraction operator to remove a key/value pair from a hash table, but you can use the Remove method of the Hashtable object. Metoda Remove przyjmuje klucz jako wartość.The Remove method takes the key as its value.

Metoda Remove ma następującą składnię:The Remove method has the following syntax:

Remove(Key)

Na przykład aby usunąć parę czas = teraz klucz/wartość z tabeli skrótów w wartości zmiennej $hash, wpisz:For example, to remove the Time=Now key/value pair from the hash table in the value of the $hash variable, type:

$hash.Remove("Time")

Można używać wszystkich właściwości i metod obiektów Hashtable w programie PowerShell, takich jak zawiera, Clear, Clone i CopyTo.You can use all of the properties and methods of Hashtable objects in PowerShell, including Contains, Clear, Clone, and CopyTo. Aby uzyskać więcej informacji na temat obiektów Hashtable, zobacz System. Collections. Hashtable.For more information about Hashtable objects, see System.Collections.Hashtable.

Typy obiektów w obiektach HashTableObject Types in HashTables

Klucze i wartości w tabeli skrótów mogą mieć dowolny typ obiektu .NET, a pojedyncza tabela skrótów może mieć klucze i wartości wielu typów.The keys and values in a hash table can have any .NET object type, and a single hash table can have keys and values of multiple types.

Poniższa instrukcja tworzy tablicę skrótów ciągów nazw procesów i przetwarza wartości obiektów i zapisuje ją w $p zmiennej.The following statement creates a hash table of process name strings and process object values and saves it in the $p variable.

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

Możesz wyświetlić tabelę skrótów w $p i użyć właściwości Key-Name, aby wyświetlić wartości.You can display the hash table in $p and use the key-name properties to display the values.

C:\PS> $p

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

C:\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

C:\PS> $p.keys | foreach {$p.$_.handles}
441
251

Klucze w tabeli skrótów mogą być również dowolnym typem platformy .NET.The keys in a hash table can also be any .NET type. Poniższa instrukcja dodaje parę klucz/wartość do tabeli skrótów w $p zmiennej.The following statement adds a key/value pair to the hash table in the $p variable. Klucz jest obiektem usługi, który reprezentuje usługę WinRM, a wartość jest bieżącym stanem usługi.The key is a Service object that represents the WinRM service, and the value is the current status of the service.

C:\PS> $p = $p + @{(Get-Service WinRM) = ((Get-Service WinRM).Status)}

Można wyświetlić nową parę klucz/wartość i uzyskać do niej dostęp za pomocą tych samych metod, które są używane dla innych par w tabeli skrótów.You can display and access the new key/value pair by using the same methods that you use for other pairs in the hash table.

C:\PS> $p

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

C:\PS> $p.keys
PowerShell
Notepad

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

C:\PS> $p.keys | foreach {$_.name}
winrm

Klucze i wartości w tabeli skrótów mogą również być obiektami Hashtable.The keys and values in a hash table can also be Hashtable objects. Poniższa instrukcja dodaje parę klucz/wartość do tabeli skrótów w $p zmiennej, w której klucz jest ciąg, Hash2, a wartość jest tabelą skrótów z trzema parami klucz/wartość.The following statement adds key/value pair to the hash table in the $p variable in which the key is a string, Hash2, and the value is a hash table with three key/value pairs.

C:\PS> $p = $p + @{"Hash2"= @{a=1; b=2; c=3}}

Można wyświetlać nowe wartości i uzyskiwać do nich dostęp przy użyciu tych samych metod.You can display and access the new values by using the same methods.

C:\PS> $p

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

C:\PS> $p.Hash2

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

C:\PS> $p.Hash2.b
2

Sortowanie kluczy i wartościSorting Keys and Values

Elementy w tabeli skrótów są w sposób nieuporządkowany.The items in a hash table are intrinsically unordered. Pary klucz/wartość mogą pojawiać się w innej kolejności przy każdej jego wyświetlania.The key/value pairs might appear in a different order each time that you display them.

Chociaż nie można sortować tabeli skrótów, można użyć metody GetEnumerator tabel skrótów, aby wyliczyć klucze i wartości, a następnie użyć polecenia cmdlet Sort-Object, aby posortować wartości wyliczane na potrzeby wyświetlania.Although you cannot sort a hash table, you can use the GetEnumerator method of hash tables to enumerate the keys and values, and then use the Sort-Object cmdlet to sort the enumerated values for display.

Na przykład następujące polecenia wylicza klucze i wartości w tabeli skrótów w $p zmiennej, a następnie sortuje klucze w kolejności alfabetycznej.For example, the following commands enumerate the keys and values in the hash table in the $p variable and then sort the keys in alphabetical order.

C:\PS> $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.The following command uses the same procedure to sort the hash values in descending order.

C:\PS> $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 tablic skrótówCreating Objects from Hash Tables

Począwszy od programu PowerShell 3,0, można utworzyć obiekt z tabeli skrótów właściwości i wartości właściwości.Beginning in PowerShell 3.0, you can create an object from a hash table of properties and property values.

Składnia wygląda następująco:The syntax is as follows:

[<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.This method works only for classes that have a null constructor, that is, a constructor that has no parameters. Właściwości obiektu muszą być publiczne i settable.The object properties must be public and settable.

Aby uzyskać więcej informacji, zobacz about_Object_Creation.For more information, see about_Object_Creation.

ConvertFrom-StringDataConvertFrom-StringData

ConvertFrom-StringDataPolecenie cmdlet konwertuje ciąg lub ciąg w tym miejscu dla par klucz/wartość w tabeli skrótów.The ConvertFrom-StringData cmdlet converts a string or a here-string of key/value pairs into a hash table. Można ConvertFrom-StringData bezpiecznie użyć polecenia cmdlet w sekcji danych skryptu i można go użyć z Import-LocalizedData poleceniem cmdlet, aby wyświetlić komunikaty użytkownika w kulturze interfejsu użytkownika bieżącego użytkownika.You can use the ConvertFrom-StringData cmdlet safely in the Data section of a script, and you can use it with the Import-LocalizedData cmdlet to display user messages in the user-interface (UI) culture of the current user.

Tutaj — ciągi są szczególnie przydatne, gdy wartości w tabeli skrótów zawierają znaki cudzysłowu.Here-strings are especially useful when the values in the hash table include quotation marks. Aby uzyskać więcej informacji na temat ciągów, zobacz about_Quoting_Rules.For more information about here-strings, see about_Quoting_Rules.

Poniższy przykład pokazuje, jak utworzyć ciąg tutaj komunikatów użytkownika w poprzednim przykładzie i jak używać ConvertFrom-StringData go do konwersji z ciągu na tablicę skrótów.The following example shows how to create a here-string of the user messages in the previous example and how to use ConvertFrom-StringData to convert them from a string into a hash table.

Poniższe polecenie tworzy ciąg par klucz/wartość, a następnie zapisuje je w $ zmiennej ciągu.The following command creates a here-string of the key/value pairs and then saves it in the $string variable.

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

To polecenie używa polecenia cmdlet ConvertFrom-StringData do przekonwertowania ciągu tutaj na tablicę skrótów.This command uses the ConvertFrom-StringData cmdlet to convert the here-string into a hash table.

C:\PS> 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, zobacz about_Quoting_Rules.For more information about here-strings, see about_Quoting_Rules.

ZOBACZ RÓWNIEŻSEE ALSO

about_Arraysabout_Arrays

about_Object_Creationabout_Object_Creation

about_Quoting_Rulesabout_Quoting_Rules

about_Script_Internationalizationabout_Script_Internationalization

ConvertFrom — StringDataConvertFrom-StringData

Import-LocalizedDataImport-LocalizedData

System. Collections. HashtableSystem.Collections.Hashtable