О хэш-таблицахAbout Hash Tables

КРАТКОЕ ОПИСАНИЕSHORT DESCRIPTION

Описывает создание, использование и сортировку хэш-таблиц в PowerShell.Describes how to create, use, and sort hash tables in PowerShell.

ПОДРОБНОЕ ОПИСАНИЕLONG DESCRIPTION

Хэш-таблица, также называемая словарем или ассоциативным массивом, представляет собой компактную структуру данных, в которой хранится одна или несколько пар "ключ-значение".A hash table, also known as a dictionary or associative array, is a compact data structure that stores one or more key/value pairs. Например, хэш-таблица может содержать ряд IP-адресов и имен компьютеров, где IP-адреса являются ключами, а имена компьютеров — значениями, и наоборот.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.

В PowerShell каждая хэш-таблица является объектом Hashtable (System. Collections. Hashtable).In PowerShell, each hash table is a Hashtable (System.Collections.Hashtable) object. В PowerShell можно использовать свойства и методы объектов Hashtable.You can use the properties and methods of Hashtable objects in PowerShell.

Начиная с PowerShell 3,0, можно использовать атрибут [ordered] для создания упорядоченного словаря (System. Collections. специализированные. Ордереддиктионари) в PowerShell.Beginning in PowerShell 3.0, you can use the [ordered] attribute to create an ordered dictionary (System.Collections.Specialized.OrderedDictionary) in PowerShell.

Упорядоченные словари отличаются от хэш-таблиц тем, что ключи всегда отображаются в порядке их перечисления.Ordered dictionaries differ from hash tables in that the keys always appear in the order in which you list them. Порядок ключей в хэш-таблице не определен.The order of keys in a hash table is not determined.

Ключи и значение в хэш-таблицах также являются объектами .NET.The keys and value in hash tables are also .NET objects. Чаще всего это строки или целые числа, но они могут иметь любой тип объекта.They are most often strings or integers, but they can have any object type. Также можно создать вложенные хэш-таблицы, в которых значение ключа является другой хэш-таблицей.You can also create nested hash tables, in which the value of a key is another hash table.

Хэш-таблицы часто используются, так как они очень эффективны для поиска и извлечения данных.Hash tables are frequently used because they are very efficient for finding and retrieving data. Хэш-таблицы можно использовать для хранения списков и создания вычисляемых свойств в PowerShell.You can use hash tables to store lists and to create calculated properties in PowerShell. И PowerShell имеет командлет ConvertFrom-StringData, который преобразует строки в хэш-таблицу.And, PowerShell has a cmdlet, ConvertFrom-StringData, that converts strings to a hash table.

СинтаксисSyntax

Синтаксис хэш-таблицы выглядит следующим образом:The syntax of a hash table is as follows:

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

Синтаксис упорядоченного словаря выглядит следующим образом:The syntax of an ordered dictionary is as follows:

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

Атрибут [ordered] появился в PowerShell 3,0.The [ordered] attribute was introduced in PowerShell 3.0.

Создание хэш-таблицCreating Hash Tables

Чтобы создать хэш-таблицу, следуйте приведенным ниже рекомендациям.To create a hash table, follow these guidelines:

  • Начните хэш-таблицу со знака @.Begin the hash table with an at sign (@).
  • Заключите хэш-таблицу в фигурные скобки ( {} ).Enclose the hash table in braces ({}).
  • Введите одну или несколько пар "ключ-значение" для содержимого хэш-таблицы.Enter one or more key/value pairs for the content of the hash table.
  • Используйте знак равенства (=) для отделения каждого ключа от его значения.Use an equal sign (=) to separate each key from its value.
  • Используйте точку с запятой (;) или разрыв строки для разделения пар «ключ-значение».Use a semicolon (;) or a line break to separate the key/value pairs.
  • Ключ, содержащий пробелы, должен быть заключен в кавычки.Key that contains spaces must be enclosed in quotation marks. Значения должны быть допустимыми выражениями PowerShell.Values must be valid PowerShell expressions. Строки должны быть заключены в кавычки, даже если они не содержат пробелов.Strings must appear in quotation marks, even if they do not include spaces.
  • Чтобы управлять хэш-таблицей, сохраните ее в переменной.To manage the hash table, save it in a variable.
  • При назначении упорядоченной хэш-таблицы переменной поместите атрибут [ordered] перед символом "@".</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="fe5e8-137">Если поместить его перед именем переменной, команда завершится ошибкой.If you place it before the variable name, the command fails.

Чтобы создать пустую хэш-таблицу в значении $hash, введите:To create an empty hash table in the value of $hash, type:

$hash = @{}

При создании хэш-таблицы можно также добавить в нее ключи и значения.You can also add keys and values to a hash table when you create it. Например, следующая инструкция создает хэш-таблицу с тремя ключами.For example, the following statement creates a hash table with three keys.

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

Создание упорядоченных словарейCreating Ordered Dictionaries

Можно создать упорядоченный словарь, добавив объект типа Ордереддиктионари, но самый простой способ создать упорядоченный словарь — использовать атрибут [ordered].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.

Атрибут [ordered] представлен в PowerShell 3,0.The [ordered] attribute is introduced in PowerShell 3.0.

Поместите атрибут непосредственно перед символом "@".</span><span class="sxs-lookup">Place the attribute immediately before the "@" symbol.

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

Упорядоченные словари можно использовать так же, как и хэш-таблицы.You can use ordered dictionaries in the same way that you use hash tables. Любой из этих типов можно использовать в качестве значения параметров, которые принимают хэш-таблицу или словарь (iDictionary).Either type can be used as the value of parameters that take a hash table or dictionary (iDictionary).

Нельзя использовать атрибут [ordered] для преобразования или приведения хэш-таблицы.You cannot use the [ordered] attribute to convert or cast a hash table. Если поместить упорядоченный атрибут перед именем переменной, команда завершится со следующим сообщением об ошибке.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

Чтобы исправить выражение, переместите атрибут [ordered].To correct the expression, move the [ordered] attribute.

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

Можно привести упорядоченный словарь к хэш-таблице, но нельзя восстановить упорядоченный атрибут, даже если очистить переменную и ввести новые значения.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. Для повторного создания заказа необходимо удалить и повторно создать переменную.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

Отображение хэш-таблицDisplaying Hash Tables

Чтобы отобразить хэш-таблицу, сохраненную в переменной, введите имя переменной.To display a hash table that is saved in a variable, type the variable name. По умолчанию хэш-таблицы отображаются в виде таблицы с одним столбцом для ключей и одной для значений.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

Хэш-таблицы имеют свойства "ключи" и "значения".Hash tables have Keys and Values properties. Используйте точечную нотацию для вывода всех ключей или всех значений.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

Каждое имя ключа является также свойством хэш-таблицы, а его значением является значение свойства Key-Name.Each key name is also a property of the hash table, and its value is the value of the key-name property. Используйте следующий формат для вывода значений свойств.Use the following format to display the property values.

$hashtable.<key>
<value>

Пример:For example:

C:\PS> $hash.Number
1

C:\PS> $hash.Color
Blue

Если имя ключа конфликтует с одним из имен свойств типа HashTable, можно использовать PSBase для доступа к этим свойствам.If the key name collides with one of the property names of the HashTable type, you can use PSBase to access those properties. Например, если имя ключа равно и необходимо keys вернуть коллекцию ключей, используйте следующий синтаксис:For example, if the key name is keys and you want to return the collection of Keys, use this syntax:

$hashtable.PSBase.Keys

Хэш-таблицы имеют свойство Count, которое указывает количество пар "ключ-значение" в хэш-таблице.Hash tables have a Count property that indicates the number of key-value pairs in the hash table.

C:\PS> $hash.count
3

Таблицы хэш-таблиц не являются массивами, поэтому нельзя использовать целое число в качестве индекса в хэш-таблице, но можно использовать имя ключа для индексации в хэш-таблице.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. Если ключ является строковым значением, заключите имя ключа в кавычки.If the key is a string value, enclose the key name in quotation marks.

Пример:For example:

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

Добавление и удаление ключей и значенийAdding and Removing Keys and Values

Чтобы добавить ключи и значения в хэш-таблицу, используйте следующий формат команды:To add keys and values to a hash table, use the following command format.

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

Например, чтобы добавить в хэш-таблицу ключ "Time" со значением "Now", используйте следующий формат инструкции.For example, to add a "Time" key with a value of "Now" to the hash table, use the following statement format.

$hash["Time"] = "Now"

Также можно добавить ключи и значения в хэш-таблицу с помощью метода Add объекта 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. Метод Add имеет следующий синтаксис:The Add method has the following syntax:

Add(Key, Value)

Например, чтобы добавить в хэш-таблицу ключ "Time" со значением "Now", используйте следующий формат инструкции.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")

Кроме того, можно добавить ключи и значения в хэш-таблицу с помощью оператора сложения (+), чтобы добавить хэш-таблицу в существующую хэш-таблицу.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. Например, следующая инструкция добавляет ключ "Time" со значением "Now" в хэш-таблицу в переменной $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"}

Можно также добавлять значения, хранящиеся в переменных.You can also add values that are stored in variables.

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

$hash.Add($t, $now)

Оператор вычитания нельзя использовать для удаления пары "ключ-значение" из хэш-таблицы, но можно использовать метод Remove объекта 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. Метод Remove принимает ключ в качестве значения.The Remove method takes the key as its value.

Метод Remove имеет следующий синтаксис:The Remove method has the following syntax:

Remove(Key)

Например, чтобы удалить пару "время = теперь ключ — значение" из хэш-таблицы в значении переменной $hash, введите: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")

Вы можете использовать все свойства и методы объектов Hashtable в PowerShell, включая Contains, Clear, Clone и CopyTo.You can use all of the properties and methods of Hashtable objects in PowerShell, including Contains, Clear, Clone, and CopyTo. Дополнительные сведения об объектах Hashtable см. в разделе System. Collections. Hashtable.For more information about Hashtable objects, see System.Collections.Hashtable.

Типы объектов в хэш-таблицахObject Types in HashTables

Ключи и значения в хэш-таблице могут иметь любой тип объекта .NET, а одна хэш-таблица может иметь ключи и значения нескольких типов.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.

Следующая инструкция создает хэш-таблицу строк имени процесса и значения объекта Process и сохраняет их в $p переменной.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)}

Можно отобразить хэш-таблицу в $p и использовать свойства Key-Name для вывода значений.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

Ключи в хэш-таблице могут также иметь любой тип .NET.The keys in a hash table can also be any .NET type. Следующая инструкция добавляет пару "ключ-значение" в хэш-таблицу в $p переменной.The following statement adds a key/value pair to the hash table in the $p variable. Ключ — это объект службы, представляющий службу WinRM, а значение — Текущее состояние службы.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)}

Вы можете отобразить новую пару "ключ-значение" и получить к ней доступ с помощью тех же методов, которые используются для других пар в хэш-таблице.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

Ключи и значения в хэш-таблице также могут быть объектами Hashtable.The keys and values in a hash table can also be Hashtable objects. Следующая инструкция добавляет пару "ключ-значение" в хэш-таблицу в $p переменной, в которой ключ является строкой, Hash2, а значение — хэш-таблицей с тремя парами "ключ-значение".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}}

Вы можете отображать новые значения и получать к ним доступ с помощью тех же методов.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

Сортировка ключей и значенийSorting Keys and Values

Элементы в хэш-таблице неупорядочены по отдельности.The items in a hash table are intrinsically unordered. Пары "ключ-значение" могут отображаться в отдельном порядке при каждом их отображении.The key/value pairs might appear in a different order each time that you display them.

Хотя хэш-таблицу нельзя отсортировать, можно использовать метод GetEnumerator хэш-таблиц для перечисления ключей и значений, а затем использовать командлет Sort-Object для сортировки перечисленных значений для вывода.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.

Например, следующие команды перечисляют ключи и значения в хэш-таблице в $p переменной, а затем сортируют эти ключи в алфавитном порядке.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

Следующая команда использует ту же процедуру для сортировки хэш-значений в порядке убывания.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

Создание объектов из хэш-таблицCreating Objects from Hash Tables

Начиная с PowerShell 3,0, можно создать объект из хэш-таблицы свойств и значений свойств.Beginning in PowerShell 3.0, you can create an object from a hash table of properties and property values.

Синтаксис выглядит следующим образом:The syntax is as follows:

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

Этот метод работает только для классов, имеющих конструктор со значением NULL, то есть конструктор, не имеющий параметров.This method works only for classes that have a null constructor, that is, a constructor that has no parameters. Свойства объекта должны быть общедоступными и настраиваемыми.The object properties must be public and settable.

Дополнительные сведения см. в разделе about_Object_Creation.For more information, see about_Object_Creation.

ConvertFrom-StringDataConvertFrom-StringData

ConvertFrom-StringDataКомандлет преобразует строку или строку в паре "ключ-значение" в хэш-таблицу.The ConvertFrom-StringData cmdlet converts a string or a here-string of key/value pairs into a hash table. Командлет можно безопасно использовать ConvertFrom-StringData в разделе данных скрипта. его можно использовать с Import-LocalizedData командлетом для вывода сообщений пользователя в языке и региональных параметрах пользовательского интерфейса текущего пользователя.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.

Здесь строки особенно полезны, если значения в хэш-таблице содержат кавычки.Here-strings are especially useful when the values in the hash table include quotation marks. Дополнительные сведения о строках см. в разделе about_Quoting_Rules.For more information about here-strings, see about_Quoting_Rules.

В следующем примере показано, как создать строку с сообщениями пользователя в предыдущем примере и как использовать ConvertFrom-StringData для преобразования их из строки в хэш-таблицу.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.

Следующая команда создает строку "ключ-значение", а затем сохраняет ее в $ строковой переменной.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").
"@

Эта команда использует командлет ConvertFrom-StringData для преобразования строки Here в хэш-таблицу.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".

Дополнительные сведения о строках см. в разделе about_Quoting_Rules.For more information about here-strings, see about_Quoting_Rules.

СМ. ТАКЖЕ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