Хеш таблица с windows

Хэш-таблицы в Windows PowerShell

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

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

В общем виде ассоциативный массив записывается следующим образом:

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

Пример создания хэш-таблицы в Windows PowerShell

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

Вот, например, обращение с использованием нотации свойств:

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

Обращение к элементам массива через нотации массива выглядит следующим образом:

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

Базовым типом хэш-таблиц в Windows PowerShell является System.Collections.Hashtable . Полный список его свойств и методов можно получить уже знакомым командлетом Get-Member . Так, например, в свойствах Keys хранятся все ключи массива, а в Values — значения.

Просмотр всех ключей и значений в хэш-таблице

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

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

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

Мы можем изменить значение уже существующего элемента через оператор присваивания. Допустим, студент Барамидзе у нас пересдал экзамен.

Изменение значения элемента хэш-таблицы в Windows PowerShell

А Сидоров был отчислен. И его из таблицы нам придется удалить. Для этого используется метод Remove() .

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

Можно создать пустую таблицу и уже потом заполнять её.

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

В данном случае переменные $a и $b указывают на один и тот же массив. Поменяв значение в $a , мы получим такое же изменение и в $b .

Читайте также:  Хост процесс windows rundll32 как удалить

Работа с хеш таблицами в Powershell Hashtable с примерами

08 октября 2019

Хеш таблицы в Powershell или Hashtable это отдельный тип данных, который позволяет удобно хранить значения. Хэш таблицы похожи на словари в Python или формат JSON. Кроме всего этого мы можем передавать этот тип в виде параметров команд. Мы разберем каждую особенность работы с ними на примерах.

Этот тип так же называется коллекциями и ассоциативным массивом. Такой тип данных является более гибким инструментом, чем обычные массивы. Они могут дополнять друг друга при работе в консоли.

Навигация по посту

Основы по работе с хэш таблицами

Перед тем как перейти к описанию таблиц посмотрим как выглядит другой тип, который был подробно описан в предыдущей статье массивы и листы в Powershell.

Что такое массив

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

Вывод этих данных построчный:

Чаще всего они передаются через foreach или вызываются по индексам:

В массивах нельзя удалять и добавлять элементы, но можно делать обновление элементов, и сложение словарей (считайте добавление):

Что такое hashtable

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

Пустой hashtasble объявляется так:

Обратите внимание на различие скобок с массивами.

На следующем примере мы добавим элемент в хэш таблицу выше:

В следующих примерах мы научимся получать элементы.

Powershell создание файлов и директорий

Получение и добавление элементов

В отличие от массивов, где мы получали элементов по индексам в hashtable это делается по ключам:

В предыдущих примерах мы добавляли параметры через add, но мы можем использовать и другой синтаксис:

Можно сложить две коллекции, но при условии что ключи не совпадают так как они должны быть уникальными:

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

Еще одно небольшое отличие от того, что в других языках называется словарями, использования знака = между ключом и значением. Так мы создадим заполненную хеш таблицу:

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

Использование как справочной информации

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

$env:COMPUTERNAME вернет имя компьютера из окружения и будет использоваться как ключ для получения данных из хэш таблицы.

Вызов по нескольким ключам

Powershell позволяет вызывать несколько ключей одновременно:

Если мы присвоим такие значения переменной, то она будет хранить массив:

Итерации, конвейеры и циклы

Связи с тем, что hashtable отличаются от массивов наличием ключей итерации делаются иначе.

Для примера, если мы передадим хэш таблицу через конвейер, то у нас отобразится количество объектов:

Читайте также:  Windows download manager для чего

А если используем счетчик Count отобразится количество значений:

Мы можем вызвать отдельно ключи:

И отдельно значения:

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

Переменная $PSItem аналогична такому написанию $_ .

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

GetEnumerator()

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

Изменение используя циклы

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

В разных случаях будут разные ошибки:

  • Коллекция была изменена; невозможно выполнить операцию перечисления.
  • Произошла ошибка при перечислении элементов коллекции: Коллекция была изменена; невозможно выполнить операцию перечисления
  • Collection was modified; enumeration operation may not execute.
  • An error occurred while enumerating through a collection: Collection was modified; enumeration operation may not
  • execute

Что бы избежать этого нужно выполнять клонирование:

Аналогичный вариант с новой переменной:

Hashtable как свойства

Чаще всего в Powershell бы работаем со свойствами и с коллекциями мы можем работать так же.

Создание и получение свойств

Посмотрим как вызываются свойства обычных объектов в PS:

Аналогично этому примеру мы можем получать из коллекций:

Для создания новых свойств можно использовать такой же подход:

Проверка на существование

Когда мы работаем с таким типом как hashtable важно убедиться, что ключ по которому мы обращаемся действительно существует. В большинстве языков это делается так:

Я предпочитаю вызывать все ключи и проверять, что в них есть нужный:

Так же есть метод, который проверяет, что в коллекции есть нужный ключ:

Такой же ключ есть для проверки значений:

Удаление ключей и значений

Для удаления ключей нужно использовать функцию .Remove():

Значение удалить нельзя, так как коллекции существуют только в паре. Можно обнулить подставив $null:

Удалить все элементы коллекции можно переназначив ее:

Или использовать функцию clear():

Другие возможности

Кроме хранения значений используя возможности Powershell можно использовать методы .Net и выражения. Все это мы рассмотрим ниже на примерах.

Сортировка

По умолчанию hashtable не отсортированы. Это не очень важно, так как по умолчанию значения мы получаем по ключу, но это можно сделать так:

Выражения

В одной из предыдущих статей мы вычисляли свободное место на диске с помощью Powershell, где использовалась такая команда:

Как вы можете видеть выражение, которые переводит KB в GB, имеет вид хэш таблиц. Мы их можем использовать и другим способом:

Label — это имя колонки, а знак $_ элемент, который передается через конвейер.

Выражения можно использовать в командах, которые позволяют это делать. Это команды типа Select-Object и Format-Table

Читайте также:  Как разбить разделы для линукс

Дополнительные возможности с сортировкой

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

Пример выше сортирует пользователей AD по результату из функции.

Сортировка коллекций в массиве

В статье по работе с массивами в Powershell мы рассказывали, что в них могут храниться объекты. Если там хранятся коллекции, то их тоже можно сортировать:

Передача как параметров

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

Иногда команды бывают очень длинными, что затрудняет чтение в скриптах. Мы можем изменить это представление передав параметры через коллекцию:

Таким образом мы можем передавать сразу несколько таблиц:

В командах и программах, где значения используются в виде /parametr:value тоже можно использовать такой подход. Для примера Robocopy:

Вложенные коллекции

Hashtable и массивы можно вкладывать:

Вызывать элементы можно так:

Добавление ключей и значений делается выше описанным способом:

Как видно по скриншоту ключи во вложенных хеш таблицах отображаются как Value. Если вы не знаете какой тип хранит таблица, то сможете узнать это через GetType():

С этим же примером, если мы не будем использовать GetType(), у нас выведутся все элементы:

Либо вызывать ключи обращаясь к конкретной коллекции:

Предположим, что нам нужно добавить значение в Support. На данный момент это строка, но мы сделаем массив:

Преобразование в JSON

Как вы уже заметили хэш таблицы в Powershell сильно похожи на JSON. Если вам удобнее для хранения или использования этот формат, то вы сможете выполнить преобразование:

О том как выполнить обратное преобразование будет рассказано ниже.

Получение списка USB устройств в Powershell

Вывод hashtable как таблицы

Если вам нужно изменить вывод таким образом, что бы вместо имен колонок были ключи, то это можно сделать через PSCustomObject :

Так же сработает и после создания коллекции:

Можно использовать Out-GridView для представления в графическом интерфейсе:

Если будет интересно могу описать способ добавления hashtable в базу SQL с помощью Powershell и их вывод.

Преобразование в CSV

Подробно о том как работать с CSV в Powershell мы уже говорили. Это одна из самых простых в использовании команд:

Сохранение в файл и загрузка

Мы можем сохранить коллекции в файл для дальнейшего использования. Я не нашел способов с помощью которых можно сохранить коллекции без преобразования. Один из способов использовать импорт и экспорт в формат xml:

Для загрузки выполним импорт:

Сохранить в CSV для последующей загрузки возможна, на мой взгляд, только с «костылями».

Можно использовать JSON, но так получится другой тип данных:

Как видно, в случае с JSON, мы больше не можем использовать элемент как параметр командной строки.

Если в файле находится коллекция исходного формата, то вы можете ее загрузить используя такие команды:

Пример c созданием пользователей в AD

Для тестового стенда мне нужно создать 100 пользователей. Можно перечислить параметры в команде, но это усложнит читабельность:

Оцените статью