about_Hash_Tables
Назначение: Windows PowerShell 2.0, Windows PowerShell 3.0, Windows PowerShell 4.0, Windows PowerShell 5.0
РАЗДЕЛ
about_Hash_Tables
КРАТКОЕ ОПИСАНИЕ
Содержит описание того, как создавать, использовать и сортировать хэш-таблицы в Windows PowerShell®.
ПОДРОБНОЕ ОПИСАНИЕ
Хэш-таблица, также называемая словарем или массивом ассоциативных элементов, представляет собой компактную структуру данных, в которой хранится одна или несколько пар «имя-значение». Например, хэш-таблица может содержать набор IP-адресов и имен компьютеров, причем IP-адреса являются ключами, а имена компьютеров — значениями или наоборот.
В Windows PowerShell каждая хэш-таблица представляет собой объект Hashtable (System.Collections.Hashtable). Вы можете использовать свойства и методы объектов Hashtable в Windows PowerShell.
Начиная с версии Windows PowerShell 3.0 можно использовать атрибут [ordered] для создания упорядоченного словаря (System.Collections.Specialized.OrderedDictionary) в Windows PowerShell.
Упорядоченные словари отличаются от хэш-таблиц тем, что ключи всегда располагаются в том порядке, в котором вы их указали. Порядок ключей в хэш-таблице не определен.
Ключи и значения в хэш-таблицах также являются объектами .NET. Чаще всего они являются строками или целыми числами, но могут иметь любой тип объекта. Также можно создавать вложенные хэш-таблицы, в которых значение ключа является другой хэш-таблицей.
Хэш-таблицы используются довольно часто, потому что они позволяют эффективно находить и извлекать данные. В Windows PowerShell с помощью хэш-таблиц можно хранить списки или создавать вычисляемые свойства. Кроме того, в Windows PowerShell есть командлет ConvertFrom-StringData, который преобразует строки в хэш-таблицу.
Синтаксис
Хэш-таблица имеет следующий синтаксис:
@{ <name> = <value>; [<name> = <value> ] ...}
Упорядоченный словарь имеет следующий синтаксис:
[ordered]@{ <name> = <value>; [<name> = <value> ] ...}
Атрибут [ordered] появился в Windows PowerShell 3.0.
Создание хэш-таблиц
При создании хэш-таблицы необходимо соблюдать приведенные ниже правила.
– Начинайте хэш-таблицу со знака «@».
– Заключайте хэш-таблицу в фигурные скобки ({}).
– В качестве содержимого хэш-таблицы введите одну или несколько пар «ключ-значение».
– Используйте знак «равно» (=) для отделения ключа от значения.
– Для разделения пар «ключ-значение» используйте точку с запятой (;).
– Если ключ содержит пробелы, заключите его в кавычки. Значения должны быть допустимыми выражениями Windows PowerShell. Строки должны заключаться в кавычки, даже если они не содержат пробелы.
– Для управления хэш-таблицей сохраните ее в переменной.
– При присвоении упорядоченный хэш-таблицы переменной поместите атрибут [ordered] перед символом «@». Если поместить его перед именем переменной, команда завершится ошибкой.
Чтобы создать пустую хэш-таблицу в значении переменной $hash, введите следующую команду:
$hash = @{}
При создании хэш-таблицы в нее также можно добавить ключи и значения. Например, приведенный ниже оператор создает хэш-таблицу с тремя ключами.
$hash = @{ Number = 1; Shape = "Square"; Color = "Blue"}
Создание упорядоченных словарей
Упорядоченный словарь можно создать путем добавления объекта типа OrderedDictiory, но самым простым способом создания упорядоченного словаря является использование атрибута [Ordered].
Атрибут [ordered] появился в Windows PowerShell 3.0.
Поместите атрибут непосредственно перед символом «@».
$hash = [ordered]@{ Number = 1; Shape = "Square"; Color = "Blue"}
Упорядоченные словари можно использовать так же, как хэш-таблицы. И тех, и других можно использовать в качестве значений параметров, которые принимают хэш-таблицы или словари (iDictionary).
Атрибут [ordered] нельзя использовать для преобразования или приведения хэш-таблицы. Если поместить атрибут [ordered] перед именем переменной, команда завершится сбоем и появится приведенное ниже сообщение об ошибке.
PS C:\> [ordered]$hash = @{}
At line:1 char:1
+ [ordered]$hash = @{}
+ ~~~~~~~~~~~~~~
The ordered attribute can be specified only on a hash literal node.
+ CategoryInfo : ParserError: (:) [], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : OrderedAttributeOnlyOnHashLiteralNode
To correct the expression, move the [ordered] attribute.
PS C:\> $hash = [ordered]@{}
Упорядоченный словарь можно привести к хэш-таблице, но восстановить атрибут ordered нельзя, даже если очистить переменную и ввести новые значения. Чтобы восстановить порядок, нужно удалить и повторно создать переменную.
PS C:\> [hashtable]$hash = [ordered]@{ Number = 1; Shape = "Square"; Color = "Blue"}
PS C:\ps-test> $hash
Name Value
---- -----
Color Blue
Shape Square
Number 1
Отображение хэш-таблиц
Чтобы отобразить хэш-таблицу, сохраненную в переменной, введите имя переменной. По умолчанию хэш-таблица отображается в виде таблицы с одним столбцом для ключей и одним — для значений.
C:\PS> $hash
Name Value
---- -----
Shape Square
Color Blue
Number 1
Хэш-таблицы имеют свойства Keys и Values. Для отображения всех ключей или всех значений используйте точечную нотацию.
C:\PS> $hash.keys
Number
Shape
Color
C:\PS> $hash.values
1
Square
Blue
Имя каждого ключа также является свойством хэш-таблицы, а его значение является значением свойства key-name. Для отображения значений свойств используйте приведенный ниже формат.
$hashtable.<key>
<value>
Например:
C:\PS> $hash.Number
1
C:\PS> $hash.Color
Blue
Хэш-таблицы имеют свойство Count, которое указывает количество пар «ключ-значение» в хэш-таблице.
C:\PS> $hash.count
3
Хэш-таблицы не являются массивами, поэтому использовать целое число как индекс в хэш-таблице нельзя, но в этих целях можно использовать имя ключа. Если ключ является строковым значением, заключите имя ключа в кавычки.
Например:
C:\PS> $hash["Number"]
1
Добавление и удаление ключей и значений
Для добавления ключей и значений в хэш-таблицу используйте приведенный ниже формат команды.
$hash["<key>"] = "<value>"
Например, чтобы добавить ключ «Time» со значением «Now» в хэш-таблицу, используйте приведенный ниже формат оператора.
$hash["Time"] = "Now"
Ключи и значения можно также добавлять в хэш-таблицу с помощью метода Add объекта System.Collections.Hashtable. Метод Add имеет следующий синтаксис:
Add(Key, Value)
Например, чтобы добавить ключ «Time» со значением «Now» в хэш-таблицу, используйте приведенный ниже формат оператора.
$hash = $hash.Add("Time", "Now")
Кроме того, ключи и значения можно добавлять в хэш-таблицу с помощью оператора сложения (+), который добавляет хэш-таблицу в существующую хэш-таблицу. Например, приведенный ниже оператор добавляет ключ «Time» со значением «Now» в хэш-таблицу в переменной $hash.
$hash = $hash + @{Time="Now"}
Вы также можете добавлять значения, хранящиеся в переменных.
$t = "Today"
$now = (Get-Date)
$hash.Add($t, $now)
Для удаления пары «ключ-значение» из хэш-таблицы нельзя использовать оператор вычитания, но можно использовать метод Remove объекта Hashtable. Метод Remove принимает ключ в качестве значения.
Метод Remove имеет следующий синтаксис:
Remove(Key)
Например, чтобы удалить пару «ключ-значение» Time=Now из хэш-таблицы в значении переменной $hash, введите следующую команду:
$hash.$Remove("Time")
Вы можете использовать все свойства и методы объектов Hashtable в Windows PowerShell, включая Contains, Clear, Clone и CopyTo. Подробнее об объектах Hashtable см. в разделе «System.Collections.Hashtable» на сайте MSDN.
Типы объектов в хэш-таблицах
Ключи и значения в хэш-таблице могут иметь любой тип объекта .NET. Хэш-таблица может содержать ключи и значения разных типов.
Приведенный ниже оператор создает хэш-таблицу, содержащую строки имен процессов и значения объектов процессов, и сохраняет ее в переменной $p.
$p = @{"PowerShell" = (get-process PowerShell);
"Notepad" = (get-process notepad)}
Вы можете отобразить хэш-таблицу, хранящуюся в переменной $p, и использовать свойства key-name для отображения значений.
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. Приведенный ниже оператор добавляет пару «ключ-значение» в хэш-таблицу в переменной $p. Ключ является объектом Service, представляющим службу WinRM, а значение представляет текущее состояние службы.
C:\PS> $p = $p + @{(Get-Service WinRM) = ((Get-Service WinRM).Status)}
Для отображения новой пары «ключ-значение» и доступа к ней можно использовать те же методы, что и для других пар в хэш-таблице.
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. Приведенный ниже оператор добавляет пару «ключ-значение» в хэш-таблицу в переменной $p. В этой паре ключ представляет собой строку Hash2, а значение — хэш-таблицу с тремя парами «ключ-значение».
C:\PS> $p = $p + @{"Hash2"= @{a=1; b=2; c=3}}
Для отображения новых значений и доступа к ним можно использовать те же методы.
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
Сортировка ключей и значений
По своей природе элементы в хэш-таблице не упорядочены. Каждый раз при отображении пар «ключ-значение» они могут представать в другом порядке.
Хотя отсортировать хэш-таблицу нельзя, с помощью метода GetEnumerator хэш-таблицы можно перечислить ключи и значения, а затем использовать командлет Sort-Object для сортировки отображаемых перечисленных значений.
Например, приведенные ниже команды перечисляют ключи и значения в хэш-таблице, хранящейся в переменной $p, а затем сортируют ключи в алфавитном порядке.
C:\PS> $p.GetEnumerator() | Sort-Object -Property key
Name Value
---- -----
Notepad System.Diagnostics.Process (notepad)
PowerShell System.Diagnostics.Process (PowerShell)
System.ServiceProcess.Servi... Running
Приведенная ниже команда использует ту же процедуру для сортировки значений хэша по убыванию.
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
Создание объектов на основе хэш-таблиц
Начиная с версии Windows PowerShell 3.0 можно создать объект на основе хэш-таблицы, содержащей свойства и их значения.
Синтаксис выглядит следующим образом:
[<class-name>]@{<property-name>=<property-value>;<property-name>=<property-value>}
Этот метод работает только в отношении классов, имеющих конструктор null, то есть конструктор без параметров. Свойства объекта должны быть открытыми и настраиваемыми.
Подробнее см. в разделе about_Object_Creation.
ConvertFrom-StringData
Командлет ConvertFrom-StringData преобразует строку или here-строку, содержащую пары «ключ-значение», в хэш-таблицу. Командлет ConvertFrom-StringData можно безопасно использовать в разделе Data сценария, либо его можно использовать с командлетом Import-LocalizedData для вывода сообщений с применением языка и региональных параметров пользовательского интерфейса текущего пользователя.
Here-строки особенно удобно использовать в случаях, когда значения в хэш-таблице включают кавычки. (Подробнее о here-строках см. в разделе about_Quoting_Rules.)
В примере ниже показано, как создать here-строку из пользовательских сообщений из предыдущего примера и с помощью командлета ConvertFrom-StringData преобразовать эту строку в хэш-таблицу.
Приведенная ниже команда создает here-строку из пар «ключ-значение», а затем сохраняет ее в переменной $string.
C:\PS> $string = @"
Msg1 = Type "Windows".
Msg2 = She said, "Hello, World."
Msg3 = Enter an alias (or "nickname").
"@
Эта команда использует командлет ConvertFrom-StringData, чтобы преобразовать here-строку в хэш-таблицу.
C:\PS> ConvertFrom-StringData $string
Name Value
---- -----
Msg3 Enter an alias (or "nickname").
Msg2 She said, "Hello, World."
Msg1 Type "Windows".
Дополнительные сведения о here-строках см. в разделе about_Quoting_Rules.
СМ. ТАКЖЕ
about_Arrays
about_Object_Creation
about_Quoting_Rules
about_Script_Internationalization
ConvertFrom-StringData
Import-LocalizedData
«System.Collections.Hashtable» на сайте MSDN