Powershell создание хэш таблицы

Обновлено: 04.07.2024

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

Подробное описание

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

В PowerShell каждая хэш-таблица является объектом Hashtable (System. Collections. Hashtable). В PowerShell можно использовать свойства и методы объектов Hashtable.

Начиная с PowerShell 3,0, можно использовать атрибут [ordered] для создания упорядоченного словаря (System. Collections. специализированные. ордереддиктионари) в PowerShell.

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

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

Синтаксис

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

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

Атрибут [ordered] появился в PowerShell 3,0.

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

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

  • Начните хэш-таблицу со знака @ @ .
  • Заключите хэш-таблицу в фигурные скобки ( <> ).
  • Введите одну или несколько пар "ключ-значение" для содержимого хэш-таблицы.
  • Используйте знак равенства ( = ) для отделения каждого ключа от его значения.
  • Используйте точку с запятой ( ; ) или разрыв строки для разделения пар "ключ-значение".
  • Ключи, содержащие пробелы, должны быть заключены в кавычки. Значения должны быть допустимыми выражениями PowerShell. Строки должны быть заключены в кавычки, даже если они не содержат пробелов.
  • Чтобы управлять хэш-таблицей, сохраните ее в переменной.
  • При назначении упорядоченной хэш-таблицы переменной поместите атрибут [ordered] перед @ символом. Если поместить его перед именем переменной, команда завершится ошибкой.

Чтобы создать пустую хэш-таблицу в значении $hash, введите:

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

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

Можно создать упорядоченный словарь, добавив объект типа ордереддиктионари , но самым простым способом создания упорядоченного словаря является использование [ordered] атрибута.

[ordered] Атрибут введен в PowerShell 3,0.

Поместите атрибут непосредственно перед символом "@".

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

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

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

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

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

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

Если имя ключа конфликтует с одним из имен свойств типа HashTable, можно использовать PSBase для доступа к этим свойствам. Например, если имя ключа равно и необходимо keys вернуть коллекцию ключей, используйте следующий синтаксис:

Хэш-таблицы имеют свойство Count, которое указывает количество пар "ключ-значение" в хэш-таблице.

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

Добавление и удаление ключей и значений

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

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

Также можно добавить ключи и значения в хэш-таблицу с помощью метода Add объекта System. Collections. Hashtable. Метод Add имеет следующий синтаксис:

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

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

Можно также добавлять значения, хранящиеся в переменных.

Оператор вычитания нельзя использовать для удаления пары "ключ-значение" из хэш-таблицы, но можно использовать метод Remove объекта Hashtable. Метод Remove принимает ключ в качестве значения.

Метод Remove имеет следующий синтаксис:

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

Вы можете использовать все свойства и методы объектов Hashtable в PowerShell, включая Contains, Clear, Clone и CopyTo. Дополнительные сведения об объектах Hashtable см. в разделе System. Collections. Hashtable.

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

Следующая инструкция создает хэш-таблицу строк имени процесса и значения объекта Process и сохраняет их в $p переменной.

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

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

Ключи и значения в хэш-таблице также могут быть объектами Hashtable. Следующая инструкция добавляет пару "ключ-значение" в хэш-таблицу в $p переменной, в которой ключ является строкой, Hash2, а значение — хэш-таблицей с тремя парами "ключ-значение".

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

Сортировка ключей и значений

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

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

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

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

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

Начиная с PowerShell 3,0, можно создать объект из хэш-таблицы свойств и значений свойств.

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

Этот метод работает только для классов, имеющих конструктор со значением NULL, то есть конструктор, не имеющий параметров. Свойства объекта должны быть общедоступными и настраиваемыми.

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

ConvertFrom-StringData

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

Следующая команда создает строку "ключ-значение", а затем сохраняет ее в $string переменной.

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

Как работает конвейер в Powershell и что такое pipeline на примерах

Ключевой особенностью Powershell, которая отличает его от других языков, это работа с конвейером. Дело в том, что каждая команда в Powershell возвращает множество объектов, а не один объект типа строка. Такой метод дает дополнительные возможности для работы с языком. Конвейер так же называют pipe или pipeline. В это статье будут рассмотрены примеры работы конвейера, его сравнение с bash, отличие от циклов и создание функции принимающей данные с конвейера.

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

Как работает конвейер

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

В примере ниже слева указана строка, которая выводится через команду справа:

Предыдущий пример идентичен, по функциональности и результату, следующему выполнению:

Работа конвейера и обычно команды с параметрами Powershell

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

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

Передача массивов через конвейер Powershell

Так мы получим только день из сегодняшней даты:

stdin, stdout и stderr

Если вам сложно понять работу конвейера с примеров выше вы можете ознакомиться с понятием потоков (streams). Потоки реализованы в *nix системах и Windows. В Powershell реализовано 7 потоков, но основная концепция понятна в 3 потоках, которые так же реализованы в *nix системах. Это:

  • stdin - ввод данных. Этот поток используется, когда вы печатаете текст или, например, когда результат работы одной команды принимает следующая. На уровне Powershell этого потока нет (в документациях не указывается, но скорее всего он реализован на уровне ОС);
  • stdout - вывод результата. Этот результат может быть направлен на экран консоли, в файл, в другую команду и т.д. В powershell этот поток называется "Success Stream";
  • stderr - вывод ошибок. В Powershell называется "Error Stream".

Пример работы этих потоков в обычном виде:

Работа stdin и stdout в Powershell

В 1-ом случае мы используем stdin т.к. напечатали команду с клавиатуры. После вызова команды мы получили stdout (2). При ошибках мы получаем stderr.

В конвейере работает такой же принцип:

Работа stdin и stdout в конвейере Powershell

Разница конвейеров bash и Powershell

Разница работы конвейеров в типе объектов, которые через них проходят. В Powershell, в подавляющем большинстве, возвращается (попадают в stdout) массивы следующего вида:

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

Передача массивов ключ-значение через конвейер Powershell

Bash же отправляет в stdout информацию в виде строки:

Так как это сплошной текст - нам приходится использовать дополнительные механизмы для поиска нужных данных. Например grep:

Сравнение конвейера Powershell и Bash

Есть и другие отличия. Например в Powershell есть переменные, в которые и помещаются данные конвейера: $PSItem или $_. Часть из таких возможностей будет рассмотрена далее.

Различия с циклом

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

Сравнение цикла и пайплайна в Powershell

У нас использован совершенно обычный цикл, который есть во всех языках. Мы объявляем переменную "$item", в которую помещается временное значение. Это значение мы отдельно выводим. Т.е. мы выполняем 3 действия:

  1. Объявление цикла;
  2. Объявление переменной с текущим значением;
  3. Вывод переменной (или другие действия, например сохранение данных в файл).

В Powershell реализован так же команда-цикл "ForEach-Object". Особенность этой команды в том, что используется только часть возможности конвейера и часть от обычного цикла:

Сравнение ForEach-Object и пайплайна в Powershell

Как можно увидеть с примера выше у нас исчез шаг под номером 2. Мы больше не объявляем временную переменную - она формируется автоматически под именем "PSItem". Эта переменная появляется во время передачи данных через pipeline. В нее помещается результат работы "Get-PSDrive".

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

Используем PSItem в конвейере Powershell

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

Как принимаются данные с конвейера

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

Свойства, которые могут быть переданы через конвейер

Вопрос в том, как конвейер узнает, что нам нужно использовать свойство "Name" в "Restart-Service"? В одной команде множество свойств и значений, а другой множество параметров и они могут не совпадать. У нас так же не возвращаются какие-либо ошибки.

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

Какой параметр используется конвейером Powershell

  • ByPropertyName - по свойству (должен быть использован массив ключ-значение);
  • ByValue - по значению (одномерный массив).

Как передаются массивы через конвейер Powershell

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

Не все команды возвращают PSCustomObject. Это говорит о том, что вы можете использовать и другие типы объектов:

Типы массивов ключ-значение в Powershell

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

hashtable

Не все объекты Powershell могут проходить через конвейер. Как написано в документации у всех типов Powershell, кроме hashtable, есть поддержка работы через конвейеры (IEnumerable). При попытке пропустить хэш-таблицу через конвейер возникнет ошибка:

  • Get-Service : Не удается найти службу с именем службы "System.Collections.Hashtable".

Передача hastable через конвейер Powershell

Передача hastable через конвейер Powershell с GetEnumerator

Еще два способа получить только ключи или только значения:

Другие возможности получения значений из хэш-таблиц Powershell

Создание функции работающей через Pipeline

Еще один способ понять работу конвейера - это создать собственную команду (функцию). Мы можем объявить два параметра, которые могут быть использованы вместе, так и отдельно:

Эти параметры мы можем совмещать, так и указывать отдельно:

Создание функции принимающей массив через конвейер Powershell

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

Создание функции принимающей массив ключ-значение через конвейер Powershell

Мы можем комбинировать параметры ValueFromPipelineByPropertyName и ValueFromPipeline. Я бы рекомендовал избегать таких способов т.к. в них легко запутаться:

Совмещение параметров работающие с конвейером Powershell

Обратите внимание на помеченные фрагменты. Мы должны определять тип данных, который ожидается (случай 1 и 2) иначе конвейер не будет обрабатывать некоторые данные корректно. Так же, в случае 3, у нас выводится только последний элемент. Это происходит из-за отсутствия Process.

Блок Process

При создании функций в Powershell вы можете использовать блоки: begin, process и end. В большинстве случаев это не требуется и вы можете писать функцию по принципам описанным выше. В случае конвейеров эти блоки приобретают дополнительный смысл:

  • begin - значение, переданное через конвейер, этому блоку не известно. Оно будет равно $null либо другому значению по умолчанию, которое вы установите;
  • process - обрабатывает каждый элемент переданные через конвейер отдельно;
  • end - обрабатывает только последний элемент переданный через конвейер. Если вы не указывали какие-то блоки, как в примере выше, по умолчанию используется именно этот блок. Из-за этого выводится только последний элемент массива.

Пример работы всех блоков:

Создание команды Powershell с begin end и process

Там, где использовался конвейер, появился 0. Это связано с тем, что блоку begin не известна эта переменна, т.е. это значение равно $Null. Т.к. эта переменная должна хранить число, а не строку, этот тип преобразовывается в 0:


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

Оптимизация создание функции с блоком process Powershell

Массивы

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

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

Создание функции Powershell принимающие массив через конвейер

  • Не удается обработать преобразование аргументов для параметра "param". Не удается преобразовать значение.

Создание функции Powershell принимающие массив через конвейер

Если вам нужно передавать именованные параметры, то нужно будет организовывать дополнительные проверки. Я не рекомендую использовать такие сложные конструкции.

Асинхронное выполнение

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

В примере ниже видно, что мы передаем значения из массива постепенно, а не целиком. У нас чередуется выполнение функций (a,b,a. ):

Асинхронное выполнение конвейера в Powershell

Ошибки

При создании конвейеров легко запутаться и получить странную ошибку. Часть из них рассмотрена ниже.

  • Не удается привязать объект ввода к любым параметрам команды, так как команда не принимает входные данные конвейера, либо входные данные и их свойства не совпадают с любыми из параметров, принимающих входные данные конвейера;
  • The input object cannot be bound to any parameters for the command either because the command does not take pipeline input or the input and its properties do not match any of the parameters that take pipeline input.

Ошибки при работе с конвейером Powershell

Если вы укажете код вне блока Process, то так же получите странную ошибку:

Использование хеш таблиц в Powershell Hashtable и создание на примерах

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

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

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

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

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

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

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

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

Массивы Powershell

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

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

Изменения массива в Powershell

Что такое hashtable

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

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

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

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

powershell хэш таблицы

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

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

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

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

получение данных хэш таблицы powershell

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

изменение данных hashtable powershell

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

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

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

создание hashtable powershell

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

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

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

вызов коллекции powershell

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

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

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

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

вызов коллекции powershell и изменение

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

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

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

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

Count powershell hash

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

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

Count powershell hash

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

конвейер powershell hashtable

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

Подстановка данных powershell hashtable

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

GetEnumerator()

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

Подстановка данных powershell hashtable

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

В отличие от других языков мы не можем изменять коллекции 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

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

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

Изменение данных powershell hashtable

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

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

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

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

Получение данных powershell hashtable

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

Получение данных powershell hashtable

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

Изменение данных powershell hashtable

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

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

проверка powershell hashtable

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


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

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

проверка хэш таблицы powershell

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

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

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

удаление в хэш таблице powershell

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

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

удаление хэш таблиц powershell

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

Сортировка

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

сортировка хэш таблиц powershell

Выражения

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

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

выражение в хэш таблице powershell

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

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

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

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

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

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

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

сортировка hashtable powershell

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

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

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

передача как параметров hashtable powershell

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

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

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

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

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

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

вложенный hashtable powershell

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

вложенные хэш таблицы powershell

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

вложенные хэш таблицы powershell

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

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

изменение вложенных хэш таблиц powershell

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

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

powershell hashtable json

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

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

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

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

powershell hashtable преобразование

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

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

powershell hashtable преобразование

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

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

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

powershell hashtable преобразование в CSV

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

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

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

powershell hashtable импорт и сохранение

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

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

powershell hashtable сохранение и загрузка

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

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

powershell hashtable сохранение в файл

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

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

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

Подробное описание

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

В PowerShell каждая хэш-таблица является объектом Hashtable (System. Collections. Hashtable). В PowerShell можно использовать свойства и методы объектов Hashtable.

Начиная с PowerShell 3,0, можно использовать атрибут [ordered] для создания упорядоченного словаря (System. Collections. специализированные. ордереддиктионари) в PowerShell.

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

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

Синтаксис

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

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

Атрибут [ordered] появился в PowerShell 3,0.

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

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

  • Начните хэш-таблицу со знака @ @ .
  • Заключите хэш-таблицу в фигурные скобки ( <> ).
  • Введите одну или несколько пар "ключ-значение" для содержимого хэш-таблицы.
  • Используйте знак равенства ( = ) для отделения каждого ключа от его значения.
  • Используйте точку с запятой ( ; ) или разрыв строки для разделения пар "ключ-значение".
  • Ключи, содержащие пробелы, должны быть заключены в кавычки. Значения должны быть допустимыми выражениями PowerShell. Строки должны быть заключены в кавычки, даже если они не содержат пробелов.
  • Чтобы управлять хэш-таблицей, сохраните ее в переменной.
  • При назначении упорядоченной хэш-таблицы переменной поместите атрибут [ordered] перед @ символом. Если поместить его перед именем переменной, команда завершится ошибкой.

Чтобы создать пустую хэш-таблицу в значении $hash, введите:

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

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

Можно создать упорядоченный словарь, добавив объект типа ордереддиктионари , но самым простым способом создания упорядоченного словаря является использование [ordered] атрибута.

[ordered] Атрибут введен в PowerShell 3,0.

Поместите атрибут непосредственно перед символом "@".

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

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

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

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

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

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

Если имя ключа конфликтует с одним из имен свойств типа HashTable, можно использовать PSBase для доступа к этим свойствам. Например, если имя ключа равно и необходимо keys вернуть коллекцию ключей, используйте следующий синтаксис:

Хэш-таблицы имеют свойство Count, которое указывает количество пар "ключ-значение" в хэш-таблице.

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

Добавление и удаление ключей и значений

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

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

Также можно добавить ключи и значения в хэш-таблицу с помощью метода Add объекта System. Collections. Hashtable. Метод Add имеет следующий синтаксис:

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

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

Можно также добавлять значения, хранящиеся в переменных.

Оператор вычитания нельзя использовать для удаления пары "ключ-значение" из хэш-таблицы, но можно использовать метод Remove объекта Hashtable. Метод Remove принимает ключ в качестве значения.

Метод Remove имеет следующий синтаксис:

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

Вы можете использовать все свойства и методы объектов Hashtable в PowerShell, включая Contains, Clear, Clone и CopyTo. Дополнительные сведения об объектах Hashtable см. в разделе System. Collections. Hashtable.

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

Следующая инструкция создает хэш-таблицу строк имени процесса и значения объекта Process и сохраняет их в $p переменной.

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

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

Ключи и значения в хэш-таблице также могут быть объектами Hashtable. Следующая инструкция добавляет пару "ключ-значение" в хэш-таблицу в $p переменной, в которой ключ является строкой, Hash2, а значение — хэш-таблицей с тремя парами "ключ-значение".

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

Сортировка ключей и значений

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

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

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

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

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

Начиная с PowerShell 3,0, можно создать объект из хэш-таблицы свойств и значений свойств.

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

Этот метод работает только для классов, имеющих конструктор со значением NULL, то есть конструктор, не имеющий параметров. Свойства объекта должны быть общедоступными и настраиваемыми.

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

ConvertFrom-StringData

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

Следующая команда создает строку "ключ-значение", а затем сохраняет ее в $string переменной.

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

Читайте также: