Руководство для начинающих по использованию хэш-таблиц PowerShell

Сталкиваясь с хэш-таблицами впервые, вы можете задаваться вопросом, что они такое и какую ключевую роль они играют в ваших сценариях или командах. Не волнуйтесь! В этом руководстве вы найдете все необходимое для начала работы с использованием хэш-таблиц в PowerShell.

Вкратце, хэш-таблицы позволяют вам хранить и манипулировать данными с использованием пар ключ-значение, к которым можно быстро и эффективно получить доступ. И в этом руководстве вы узнаете основы работы с хэш-таблицами и как использовать их в ваших сценариях и командах PowerShell.

Читайте далее и начинайте расширять свой набор навыков с помощью хэш-таблиц PowerShell!

Предварительные требования

Это практическое руководство, поэтому, чтобы следовать за ним, убедитесь, что у вас установлена и настроена система с PowerShell версии 5 и выше. В этом руководстве используется Windows 10 с PowerShell 7, но другие версии PowerShell и Windows также подойдут.

Создание хэш-таблицы в PowerShell

Получение конкретных данных может превратиться в “иголку в стоге сена” в какой-то момент. Но с помощью хэш-таблиц вы можете быстро искать определенные элементы в обширной коллекции данных.

В PowerShell хэш-таблицы являются гибкими структурами данных, которые используются во многих случаях, таких как хранение конфигурационных данных, передача аргументов в cmdlet’ы и хранение данных в сценарии.

Чтобы увидеть, как работает хэш-таблица в PowerShell, вам сначала нужно создать ее следующим образом:

1. Откройте сеанс PowerShell и запустите следующую команду, которая не выводит никакого результата, но объявляет переменную с именем name, ссылается на пустой хэш-таблицы.

Как видите ниже, подобно массивам в PowerShell, хэш-таблицы определяются с помощью символа @.

$name = @{}

2. Затем выполните следующую команду, чтобы узнать тип переменной name (GetType()).

$name.GetType()

Тип переменной name – это Hashtable, как показано ниже. Эта информация подтверждает успешное создание хэш-таблицы.

Verifying the newly-created hashtable

3. После проверки хэш-таблицы выполните следующий код, чтобы проверить, является ли она пустой или нет.

Данный код определяет, равно ли значение свойства Count (-eq) 0 и выводит соответствующее сообщение.

# Сравниваем, равно ли значение свойства Count (-eq) 0
if ($name.Count -eq 0) {
	# Если да, выводим следующее сообщение.
  Write-Output "The hashtable is empty."
} else {
	# В противном случае выводим следующее сообщение.
  Write-Output "The hashtable is not empty."
}

Ниже вы можете видеть, что хеш-таблица пуста, так как вы только что создали ее, и в ней нет определенных пар ключ-значение.

Checking if the hashtable is empty or not

Добавление элементов в хеш-таблицу PowerShell

Вы только что создали почти пустую хеш-таблицу PowerShell, которая может быть полезна только при добавлении элементов. Как это сделать? Добавив пары ключ-значение в хеш-таблицу.

Аналогично массиву, но вместо использования целых чисел в качестве индексов, хеш-таблица PowerShell использует ключи (которые могут быть любого типа данных) для идентификации значений. Эта функция позволяет быстро добавлять, извлекать и удалять элементы из хеш-таблицы, так как ключ быстро находит соответствующее значение.

Ниже приведен синтаксис добавления пары ключ-значение в хеш-таблицу PowerShell, где:

  • $hashtable – имя хеш-таблицы.
  • $key – имя ключа, который не чувствителен к регистру. Например, “FirstName” и “firstname” будут считаться одним и тем же ключом в хеш-таблице
  • $value – значение, связанное с ключом.
$hashtable[$key] = $value

Запустите следующий код, который не выводит данные в консоль, но объявляет пары ключ-значение и добавляет их в вашу хеш-таблицу ($name).

В хеш-таблице ключ позволяет выполнить хэширование, которое отображает ключ на конкретное место во внутренней структуре данных хеш-таблицы.

? Значения в хеш-таблице могут быть любого типа, такие как числа, строки, массивы, объекты и другие типы данных.

# Объявите ключ FirstName
$key = "FirstName"
# Объявите значение ключа
$value = "John"
# Добавьте элемент в хэш-таблицу
$name[$key] = $value

# Объявите ключ LastName
$key = "LastName"
# Объявите значение ключа
$value = "Doe"
# Добавьте элемент в хэш-таблицу
$name[$key] = $value

Теперь запустите код ниже, чтобы проверить, пуста ли ваша хэш-таблица.

if ($name.Count -eq 0) {
  Write-Output "The hashtable is empty."
} else {
  Write-Output "The hashtable is not empty."
}

Как показано ниже, вы получите сообщение о том, что на этот раз хэш-таблица не пуста.

Checking if the hashtable is empty or not

Получение элементов из хэш-таблицы PowerShell

Предположим, что вы уверены, что ваша хэш-таблица не пуста. Как вы узнаете, какие элементы существуют в вашей хэш-таблице? К счастью, вы также можете получить элементы из своей хэш-таблицы.

Запустите код ниже, чтобы извлечь и вывести (Write-Output) все элементы из вашей хэш-таблицы в виде пар ключ-значение, по одной на строку.`

# Перебирает все пары ключ-значение в хэш-таблице
foreach ($key in $name.Keys) {
	$value = $name[$key]
  # Выводит все пары ключ-значение в хэш-таблице, по одной на строку.
	Write-Output "${key}: ${value}"
}
Retrieving items from a PowerShell hashtable

Теперь запустите код ниже, чтобы извлечь и вывести (Write-Output) все элементы из хэш-таблицы на консоль.

? Обратите внимание, что вы часто будете использовать следующий код в этом руководстве. Вы можете избежать копирования и вставки одного и того же кода несколько раз, создав функцию, но это выходит за рамки этого руководства.

# Получить объект, который может использоваться для итерации по элементам коллекции.
$enumerator = $name.GetEnumerator()
foreach ($element in $enumerator) {
	# Выводит строку, которая включает ключ и значение каждого элемента в коллекции.
	Write-Output "Key: $($element.Key), Value: $($element.Value)"
}

На этот раз вы можете видеть указания на ключи и значения среди перечисленных элементов.

Retrieving items from a PowerShell hashtable, indicating which are the keys and value pairs

Создание хэш-таблиц с предопределенными значениями

До сих пор вы только смотрели на создание пустых хэш-таблиц. Но если вы знаете, что определенные значения всегда будут нужны в вашей хэш-таблице, вы можете создать ее с предопределенными значениями.

Хэш-таблицы с предопределенными значениями могут сэкономить время и сделать ваш код более эффективным, поскольку вам не нужно будет добавлять значения в хэш-таблицу позже.

? Обратите внимание, что создание хэш-таблиц не производит вывода. Но не волнуйтесь. В этом руководстве вы будете проверять каждую хэш-таблицу после ее создания.

1. Выполните следующую команду, чтобы создать хэш-таблицу ($hashtable1) с тремя парами ключ-значение.

$hashtable1 = @{
  "Key1" = "Value1"
  "Key2" = "Value2"
  "Key3" = "Value3"
}

2. Затем выполните следующий код для проверки существования новой хэш-таблицы (hashtable1).

# Получить объект, который можно использовать для итерации по элементам коллекции.
$enumerator = $hashtable1.GetEnumerator()
foreach ($element in $enumerator) {
  # Выводит строку, которая включает ключ и значение каждого элемента в коллекции.
	Write-Output "Key: $($element.Key), Value: $($element.Value)"
}

Вы увидите, что значения для каждой пары ключ-значение выводятся на экран, как ожидается. Этот вывод подтверждает, что предопределенные значения хранятся в соответствующих местах в хэш-таблице.

Verifying that hashtable was created successfully with predefined values

3. Теперь выполните следующий код, чтобы создать хэш-таблицу ($hashtable2) с предопределенными значениями с использованием цикла (или массива).

$keys = "Key1", "Key2", "Key3"
$values = "Value1", "Value2", "Value3"
$hashtable2 = @{}
for ($i = 0; $i -lt $keys.Count; $i++) {
  $hashtable2[$keys[$i]] = $values[$i]
}

4. Наконец, выполните следующий код, чтобы проверить, что новая хэш-таблица (hashtable2) была успешно создана.

# Получить объект, который можно использовать для итерации по элементам коллекции.
$enumerator = $hashtable2.GetEnumerator()
foreach ($element in $enumerator) {
	# Выводит строку, которая включает ключ и значение каждого элемента в коллекции.
	Write-Output "Key: $($element.Key), Value: $($element.Value)"
}

Ниже приведен вывод, подтверждающий, что метод с использованием цикла работает при создании хэш-таблицы с предопределенными значениями. Но поскольку элементы перечислены случайным образом, перейдите к следующему разделу для исправления.

Verifying the new hashtable was created successfully

Создание упорядоченного списка элементов в хэш-таблицах

По умолчанию элементы в хэш-таблице хранятся в произвольном порядке. Но что делать, если вам нужен упорядоченный список? Вы также можете создать упорядоченный список элементов в ваших хэш-таблицах, чтобы упорядочить данные в определенном порядке.

Чтобы создать упорядоченный список элементов в вашей хэш-таблице, используйте атрибут [ordered] следующим образом:

1. Запустите следующий код, чтобы создать упорядоченный список элементов в хэш-таблице ($hashtable3).

$hashtable3 = [ordered]@{
"Key1" = "Value3"
"Key2" = "Value2"
"Key3" = "Value1"
}

2. Затем запустите следующий код, чтобы подтвердить успешное создание упорядоченного списка хэш-таблиц.

# Получить объект, который можно использовать для итерации по элементам коллекции.
$enumerator = $hashtable3.GetEnumerator()
foreach ($element in $enumerator) {
	# Вывести строку, которая содержит ключ и значение каждого элемента в коллекции.
	Write-Output "Key: $($element.Key), Value: $($element.Value)"
}

Как показано ниже, перечисленные элементы остаются в том порядке, в котором вы их определили при создании хэш-таблицы.

Некоторые возможные преимущества использования упорядоченной хэш-таблицы включают, но не ограничены следующим:

Benefits Description
Easier to read and debug The elements are displayed in a predictable order, which can be especially useful if you work with many elements of a large hashtable.
Improved performance An ordered hashtable can be more efficient when accessing elements frequently in a specific order.
Verifying that the ordered list of hashtables has been created

3. Наконец, вызовите вашу упорядоченную хэш-таблицу ($hashtable3), чтобы убедиться, что вы по-прежнему получите упорядоченный список элементов.

$hashtable3

Приведенный ниже вывод подтверждает, что вы по-прежнему получите упорядоченный список элементов независимо от того, как вы обращаетесь к вашей хэш-таблице.

Verifying the list of items is still in an ordered format

Обновление существующих элементов в хэш-таблицах

Данные постоянно меняются, и если у вас есть существующие хэш-таблицы, обновление их является важной задачей. Например, вы используете хэш-таблицу для хранения значений конфигурации. В этом случае вам может потребоваться обновить значение ключа, если конфигурация изменилась.

Для обновления хэш-таблицы PowerShell оператор присваивания = сделает все, как показано ниже:

1. Запустите следующую команду, которая не выводит результат, но обновляет значение ключа Key2 в $hashtable3 на NewValue2.

$hashtable3["Key2"] = "NewValue2"

Затем выполните следующую команду, чтобы Add() добавить новую пару ключ-значение (Key4 = NewValue4) в хэш-таблицу ($hashtable3).

Добавление новой пары ключ-значение не выводит результат, как обновление существующих списков в хэш-таблицах, но вы проверите изменения на следующем шаге.

$hashtable3.Add("Key4", "NewValue4")

3. Выполните следующий код, чтобы проверить, что значения ключей в вашей хэш-таблице ($hashtable3) были обновлены.

# Получить объект, который можно использовать для итерации по элементам коллекции.
$enumerator = $hashtable3.GetEnumerator()
foreach ($element in $enumerator) {
	# Вывести строку, которая включает ключ и значение каждого элемента в коллекции.
	Write-Output "Key: $($element.Key), Value: $($element.Value)"
}
Verifying the key values have been updated

? В PowerShell каждый ключ в хэш-таблице должен быть уникальным. Если вы попытаетесь добавить пару ключ-значение, которая уже есть в хэш-таблице, вы получите ошибку, похожую на приведенную ниже. Чтобы избежать этой ошибки, перейдите к следующему шагу.

Adding a key that already exists

4. Теперь выполните следующий код, который использует метод Contains() для проверки, существует ли ключ, который вы пытаетесь добавить, уже в хэш-таблице перед добавлением пары ключ-значение.

# Определите переменную для хранения нового ключа
$newkey="Key5"
# Проверьте, существует ли $newkey уже в хэш-таблице.
if (-not $hashtable3.Contains($newkey)) {
	# Если нет, добавьте новую пару ключ-значение.
	$hashtable3.Add($newkey, "NewValue5")
	Write-Output "The new key '$newkey' has been added to the hashtable."
} else {
	# Если ключ существует, выведите сообщение.
	Write-Output "The key '$newkey' already exists."
}

Если новый ключ не существует, вы получите сообщение ниже, говорящее, что новый ключ был добавлен в хэш-таблицу.

Checking if a key exists before adding it to the hashtable

В противном случае, как показано ниже, вы получите сообщение, если ключ, который вы пытаетесь добавить, уже существует.

Adding a key that already exists

5. Наконец, выполните код ниже, чтобы получить все элементы вашей хэш-таблицы ($hashtable3).

# Получить объект, который может использоваться для итерации по элементам коллекции.
$enumerator = $hashtable3.GetEnumerator()
foreach ($element in $enumerator) {
	# Вывести строку, которая включает ключ и значение каждого элемента в коллекции.
	Write-Output "Key: $($element.Key), Value: $($element.Value)"
}

Ниже вы можете увидеть только что добавленный ключ (Key5) и другие элементы, которые вы добавили до этого в хэш-таблицу.

Checking all items listed in a hashtable

Удаление элементов из хэш-таблицы

Слишком много элементов в хэш-таблице, особенно ненужных, может привести только к путанице. Удаление элементов, которые больше не актуальны или не нужны в вашей хэш-таблице, будет вам в помощь.

Предположим, что ваша хэш-таблица содержит список пользователей и их информацию. Если это так, удалите пользователей из вашей хэш-таблицы, если они больше не активны.

Выполните код ниже, чтобы удалить конкретный элемент (Key1) из вашей хэш-таблицы ($hashtable3).

$key = "Key5"
if ($hashtable3.Contains($key)) {
  $hashtable3.Remove($key)
  Write-Output "The key-value pair with the key '$key' was removed from the hashtable."
} else {
  Write-Output "The key-value pair with the key '$key' was not found in the hashtable."
}

Ниже выводится сообщение о том, что ключ был удален. Но если ключ не существует, вы получите сообщение о том, что ключ не найден.

Removing items from a hashtable

Теперь выполните следующий код, чтобы проверить все элементы вашей хэш-таблицы и убедиться, что удаление элемента прошло успешно.

# Получить объект, который может использоваться для итерации по элементам коллекции.
$enumerator = $hashtable3.GetEnumerator()
foreach ($element in $enumerator) {
	# Вывести строку, которая включает ключ и значение каждого элемента в коллекции.
	Write-Output "Key: $($element.Key), Value: $($element.Value)"
}

Ниже вы можете убедиться, что пара ключ-значение с ключом ‘Key5’ больше не существует в вашей хэш-таблице.

Verifying item deletion is successful

Вывод

С помощью структуры пар ключ-значение и быстрого доступа, хэш-таблица в PowerShell отлично подходит для управления большим объемом данных в различных сценариях. В этом руководстве вы узнали, как создавать, добавлять, обновлять и удалять элементы из хэш-таблиц. Все это дает вам навыки эффективного использования хэш-таблиц в ваших сценариях.

Почему бы не использовать только что полученные навыки на новом уровне? Рассмотрите возможность включения хэш-таблиц в ваши сценарии для выполнения более сложных задач, таких как обработка данных и трансформация. Или попробуйте комбинировать хэш-таблицы с другими структурами данных в PowerShell, такими как массивы и объекты, для решения более сложных задач?

Source:
https://adamtheautomator.com/powershell-hashtable/