about_Hash_Tables
Краткое описание
Описывает создание, использование и сортировку хэш-хэш-таблицей в PowerShell.
Подробное описание
Хэш-таблицы, также известный как словарь или ассоциативный массив, представляет собой компактную структуру данных, которая хранит одну или несколько пар "ключ-значение". Например, хэш-таблица может содержать ряд IP-адресов и имен компьютеров, где IP-адреса являются ключами, а имена компьютеров — значениями или наоборот.
В PowerShell каждый хэш-файл является Hashtable[System.Collections.Hashtable]
объектом. Свойства и методы Hashtable объектов можно использовать в PowerShell.
Начиная с PowerShell 3.0, можно использовать [ordered]
атрибут для создания [System.Collections.Specialized.OrderedDictionary]
объекта в PowerShell.
Упорядоченные словари отличаются от хэш-списков, что ключи всегда отображаются в порядке их перечисления. Порядок ключей в хэш-файле не определен.
Ключи и значения в хэш-файлах также являются объектами .NET. Они чаще всего являются строками или целыми числами, но они могут иметь любой тип объекта. Можно также создать вложенные хэш-элементы, в которых значение ключа является еще одним хэш-файлом.
Hashtableчасто используются, так как они эффективны для поиска и извлечения данных. Хэш-списки можно использовать для хранения списков и создания вычисляемых свойств в PowerShell. В PowerShell есть командлет, ConvertFrom-StringData
который преобразует строки в хэш-файл.
Синтаксис
Синтаксис хэш-файла выглядит следующим образом:
@{ <name> = <value>; [<name> = <value> ] ...}
Синтаксис упорядоченного словаря выглядит следующим образом:
[ordered]@{ <name> = <value>; [<name> = <value> ] ...}
Акселератор [ordered]
типов появился в PowerShell 3.0.
Создание хэш-хэш-модулей
Чтобы создать хэш-код, выполните следующие рекомендации.
- Начните хэш-файл с знаком (
@
). - Заключите хэш-файл в фигурные скобки (
{}
). - Введите одну или несколько пар "ключ-значение" для содержимого хэш-файла.
- Используйте знак равенства (
=
) для разделения каждого ключа от его значения. - Используйте точку с запятой (
;
) или разрыв строки для разделения пар "ключ-значение". - Ключи, содержащие пробелы, должны быть заключены в кавычки. Значения должны быть допустимыми выражениями PowerShell. Строки должны отображаться в кавычках, даже если они не включают пробелы.
- Чтобы управлять хэш-файлом, сохраните его в переменной.
- При назначении упорядоченного хэш-файла переменной поместите
[ordered]
тип перед символом@
. Если вы поместите его перед именем переменной, команда завершается ошибкой.
Чтобы создать пустую хэш-запись в значении $hash, введите следующее:
$hash = @{}
При создании можно также добавлять ключи и значения в хэш-таблицы. Например, следующая инструкция создает хэш-файл с тремя ключами.
$hash = @{ Number = 1; Shape = "Square"; Color = "Blue"}
Создание упорядоченных словарей
Вы можете создать упорядоченный словарь, добавив объект OrderedDictionary типа, но самый простой способ создания упорядоченного словаря — использовать [ordered]
атрибут.
Атрибут [ordered]
представлен в PowerShell 3.0.
Поместите атрибут непосредственно перед символом "@".
$hash = [ordered]@{ Number = 1; Shape = "Square"; Color = "Blue"}
Вы можете использовать упорядоченные словари таким же образом, как и хэштебли. Любой тип можно использовать в качестве значения параметров, которые принимают хэш-список или словарь (iDictionary).
Нельзя использовать [ordered]
атрибут для преобразования или приведения хэш-файла. Если вы помещете упорядоченный атрибут перед именем переменной, команда завершается ошибкой со следующим сообщением об ошибке.
[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
Чтобы исправить выражение, переместите атрибут [упорядочено].
$hash = [ordered]@{}
Вы можете привести упорядоченный словарь к хэш-таблицы, но вы не можете восстановить упорядоченный атрибут, даже если снять переменную и ввести новые значения. Чтобы повторно установить порядок, необходимо удалить и повторно создать переменную.
[hashtable]$hash = [ordered]@{
Number = 1; Shape = "Square"; Color = "Blue"}
$hash
Name Value
---- -----
Color Blue
Shape Square
Number 1
Отображение хэш-элементов
Чтобы отобразить хэш-файл, сохраненный в переменной, введите имя переменной. По умолчанию хэш-таблицы отображаются в виде таблицы с одним столбцом для ключей и одним для значений.
$hash
Name Value
---- -----
Shape Square
Color Blue
Number 1
Хэш-таблицы имеют свойства "Ключи " и "Значения ". Используйте нотацию точек для отображения всех ключей или всех значений.
$hash.keys
Number
Shape
Color
$hash.values
1
Square
Blue
Каждое имя ключа также является свойством хэш-файла, а его значение — значение свойства имени ключа. Используйте следующий формат, чтобы отобразить значения свойств.
$hashtable.<key>
<value>
Например:
$hash.Number
1
$hash.Color
Blue
Hashtables имеет свойство Count , указывающее количество пар "ключ-значение" в хэш-файле.
$hash.count
3
Хэш-таблицы не являются массивами, поэтому вы не можете использовать целое число в качестве индекса в хэш-таблицу, но можно использовать имя ключа для индексирования в хэш-таблицу. Если ключ является строковым значением, заключите имя ключа в кавычки.
Например:
$hash["Number"]
1
Обработка конфликтов имен свойств
Если имя ключа сталкивается с одним из имен свойств типа HashTable, можно использовать встроенный элемент psbaseдля доступа к этим свойствам. Например, если имя ключа и keys
вы хотите вернуть коллекцию ключей HashTable , используйте следующий синтаксис:
$hashtable.psbase.Keys
Это относится к другим типам, реализующих System.Collections.IDictionary интерфейс, например OrderedDictionary.
Итерирование ключей и значений
Вы можете выполнить итерацию по ключам в хэш-таблицы, чтобы обрабатывать значения несколькими способами. Каждый из примеров в этом разделе имеет одинаковые выходные данные. Они выполняют итерацию по переменной, определенной $hash
здесь:
$hash = [ordered]@{ Number = 1; Shape = "Square"; Color = "Blue"}
Примечание.
В этих примерах определяется как упорядоченный словарь, чтобы гарантировать, $hash
что выходные данные всегда совпадают. Эти примеры работают одинаково для обычных хэш-элементов, но порядок выходных данных не предсказуем.
Каждый пример возвращает сообщение для каждого ключа и его значения:
The value of 'Number' is: 1
The value of 'Shape' is: Square
The value of 'Color' is: Blue
В этом примере для итерации ключей используется блок foreach .
foreach ($Key in $hash.Keys) {
"The value of '$Key' is: $($hash[$Key])"
}
В этом примере используется ForEach-Object
для итерации ключей.
$hash.Keys | ForEach-Object {
"The value of '$_' is: $($hash[$_])"
}
В этом примере метод GetEnumerator используется для отправки каждой пары "ключ-значение" через конвейерForEach-Object
.
$hash.GetEnumerator() | ForEach-Object {
"The value of '$($_.Key)' is: $($_.Value)"
}
В этом примере методы GetEnumerator и ForEach используются для итерации каждой пары "ключ-значение".
$hash.GetEnumerator().ForEach({"The value of '$($_.Key)' is: $($_.Value)"})
Добавление и удаление ключей и значений
Чтобы добавить ключи и значения в хэш-таблицы, используйте следующий формат команды.
$hash["<key>"] = "<value>"
Например, чтобы добавить ключ Time со значением "Now" в хэш-таблицы, используйте следующий формат инструкции.
$hash["Time"] = "Now"
Вы также можете добавить ключи и значения в хэш-таблицы с помощью Add
метода System.Collections.Hashtable объекта. Метод Add
имеет следующий синтаксис:
Add(Key, Value)
Например, чтобы добавить Time
ключ со значением Now
хэш-таблицы, используйте следующий формат инструкции.
$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 объектов в PowerShell, включая Contains
, Clear
Clone
и CopyTo
. Дополнительные сведения об объектах Hashtable см. в разделе System.Collections.Hashtable.
Типы объектов в hashTables
Ключи и значения в хэш-таблицы могут иметь любой тип объекта .NET, а один хэш-файл может иметь ключи и значения нескольких типов.
Следующая инструкция создает хэш-таблицы имен процесса и значения объектов процесса и сохраняет его в переменной $p
.
$p = @{
"PowerShell" = (Get-Process PowerShell)
"Notepad" = (Get-Process notepad)
}
Вы можете отобразить хэш-таблицы $p
и использовать свойства имени ключа для отображения значений.
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
Ключи в хэш-файле могут быть любым типом .NET. Следующая инструкция добавляет пару "ключ-значение" в хэш-файл переменной $p
. Ключ — это объект службы , представляющий службу WinRM, а значение — текущее состояние службы.
$p = $p + @{
(Get-Service WinRM) = ((Get-Service WinRM).Status)
}
Вы можете отобразить и получить доступ к новой паре "ключ-значение", используя те же методы, которые используются для других пар в хэш-файле.
PS> $p
Name Value
---- -----
PowerShell System.Diagnostics.Process (powershell)
Notepad System.Diagnostics.Process (Notepad)
WinRM Running
PS> $p.keys
PowerShell
Notepad
Status Name DisplayName
------ ---- -----------
Running winrm Windows Remote Management (WS-Manag...
PS> $p.keys | ForEach-Object {$_.name}
WinRM
Ключи и значения в хэш-таблицы также могут быть Hashtable объектами. Следующая инструкция добавляет пару "ключ-значение" в хэш-файл в $p
переменной, в которой ключ является строкой, hash2 и значением является хэш-файл с тремя парами "ключ-значение".
$p = $p + @{
"Hash2"= @{a=1; b=2; c=3}
}
Вы можете отображать и получать доступ к новым значениям, используя те же методы.
PS> $p
Name Value
---- -----
PowerShell System.Diagnostics.Process (powershell)
Notepad System.Diagnostics.Process (Notepad)
WinRM Running
Hash2 {c, b, a}
PS> $p.Hash2
Name Value
---- -----
c 3
b 2
a 1
PS> $p.Hash2.b
2
Сортировка ключей и значений
Элементы в хэш-меню неупорядочены. Пары "ключ-значение" могут отображаться в другом порядке при каждом отображении.
Хотя хэш-таблицы нельзя сортировать, можно использовать метод getEnumerator хэш-таблицы для перечисления ключей и значений, а затем использовать Sort-Object
командлет для сортировки перечисленных значений для отображения.
Например, следующие команды перечисляют ключи и значения в хэш-таблице в переменной $p
, а затем сортируют ключи в алфавитном порядке.
PS> $p.GetEnumerator() | Sort-Object -Property key
Name Value
---- -----
Hash2 {c, b, a}
Notepad System.Diagnostics.Process (Notepad)
PowerShell System.Diagnostics.Process (powershell)
WinRM Running
Следующая команда использует ту же процедуру для сортировки хэш-значений в порядке убывания.
PS> $p.GetEnumerator() | Sort-Object -Property Value -Descending
Name Value
---- -----
PowerShell System.Diagnostics.Process (powershell)
Notepad System.Diagnostics.Process (Notepad)
Hash2 {c, b, a}
WinRM Running
Создание объектов из хэш-элементов
Начиная с PowerShell 3.0, можно создать объект из хэш-таблицы свойств и значений свойств.
Синтаксис выглядит следующим образом:
[<class-name>]@{
<property-name>=<property-value>
<property-name>=<property-value>
}
Этот метод работает только для классов, имеющих конструктор без параметров. Свойства объекта должны быть общедоступными и наборными.
Дополнительные сведения см. в about_Object_Creation.
ConvertFrom-StringData
Командлет ConvertFrom-StringData
преобразует строку или приведенную здесь строку пар "ключ-значение" в хэш-файл. Командлет можно безопасно использовать ConvertFrom-StringData
в разделе "Данные" скрипта, и его можно использовать с Import-LocalizedData
командлетом для отображения сообщений пользователей в языке и региональных параметрах пользовательского интерфейса текущего пользователя.
Здесь строки особенно полезны, если значения в хэш-таблицы включают кавычки. Дополнительные сведения о строках см. в about_Quoting_Rules.
В следующем примере показано, как создать здесь строку сообщений пользователя в предыдущем примере и как ConvertFrom-StringData
преобразовать их из строки в хэш-файл.
Следующая команда создает здесь строку пар "ключ-значение", а затем сохраняет ее в переменной $string
.
$string = @"
Msg1 = Type "Windows".
Msg2 = She said, "Hello, World."
Msg3 = Enter an alias (or "nickname").
"@
Эта команда использует ConvertFrom-StringData
командлет для преобразования строки здесь в хэш-файл.
ConvertFrom-StringData $string
Name Value
---- -----
Msg3 Enter an alias (or "nickname").
Msg2 She said, "Hello, World."
Msg1 Type "Windows".
Дополнительные сведения о строках см. в about_Quoting_Rules.
См. также
PowerShell
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по