Powershell создание хэш таблицы
Описывает создание, использование и сортировку хэш-таблиц в PowerShell.
Сохранение в файл
Этот тип можно импортировать и экспортировать из файла работая с различными форматами.
Если вы пробовали сохранить хэш таблицу в CSV, то могли испытывать сложности с этим. Я читал, что это можно сделать, но с преобразованием в объект сделать это проще всего:
На примере виден результат экспорта в CSV hashtable и csv:
С импортом таких данных проблем тоже нет:
Так же как и с hashtable вы можете конвертировать данные в Json с дальнейшим импортом и экспортом:
Этот способ работает и с хэш таблицами и с кастомными объектами:
Добавление и удаление ключей и значений
Чтобы добавить ключи и значения в хэш-таблицу, используйте следующий формат команды:
Например, чтобы добавить в хэш-таблицу ключ "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.
Подробное описание
Хэш-таблица, также называемая словарем или ассоциативным массивом, представляет собой компактную структуру данных, в которой хранится одна или несколько пар "ключ-значение". Например, хэш-таблица может содержать ряд IP-адресов и имен компьютеров, где IP-адреса являются ключами, а имена компьютеров — значениями, и наоборот.
В PowerShell каждая хэш-таблица является объектом Hashtable (System. Collections. Hashtable). В PowerShell можно использовать свойства и методы объектов Hashtable.
Начиная с PowerShell 3,0, можно использовать атрибут [ordered] для создания упорядоченного словаря (System. Collections. специализированные. ордереддиктионари) в PowerShell.
Упорядоченные словари отличаются от хэш-таблиц тем, что ключи всегда отображаются в порядке их перечисления. Порядок ключей в хэш-таблице не определен.
Хэш-таблицы часто используются, так как они очень эффективны для поиска и извлечения данных. Хэш-таблицы можно использовать для хранения списков и создания вычисляемых свойств в PowerShell. И PowerShell имеет командлет, ConvertFrom-StringData , который преобразует строки в хэш-таблицу.
Создание хэш-таблиц
Чтобы создать хэш-таблицу, следуйте приведенным ниже рекомендациям.
- Начните хэш-таблицу со знака @ @.
- Заключите хэш-таблицу в фигурные скобки ( <> ).
- Введите одну или несколько пар "ключ-значение" для содержимого хэш-таблицы.
- Используйте знак равенства ( = ) для отделения каждого ключа от его значения.
- Используйте точку с запятой ( ; ) или разрыв строки для разделения пар "ключ-значение".
- Ключи, содержащие пробелы, должны быть заключены в кавычки. Значения должны быть допустимыми выражениями PowerShell. Строки должны быть заключены в кавычки, даже если они не содержат пробелов.
- Чтобы управлять хэш-таблицей, сохраните ее в переменной.
- При назначении упорядоченной хэш-таблицы переменной поместите атрибут [ordered] перед @ символом. Если поместить его перед именем переменной, команда завершится ошибкой.
Чтобы создать пустую хэш-таблицу в значении $hash, введите:
При создании хэш-таблицы можно также добавить в нее ключи и значения. Например, следующая инструкция создает хэш-таблицу с тремя ключами.
10.4 Объединение хэш-таблиц
Хэш-таблицы можно объединить с помощью операторов + и += , которые приводят к созданию нового объекта Hashtable . Существующие хэш-таблицы не изменяются. Дополнительные сведения см. в разделе § 7.7.4.
Преобразование в CSV
Подробно о том как работать с CSV в Powershell мы уже говорили. Это одна из самых простых в использовании команд:
10.3 Добавление и удаление элементов хэш-таблицы
Чтобы добавить элемент в Hashtable , можно назначить (§ 7.11.1) значение несуществующему имени ключа или индексу (§ 7.1.4.3), который использует несуществующее имя ключа. Для удаления элемента необходимо использовать метод Remove. Например, примененная к объекту директива
Создание объектов из хэш-таблиц
Начиная с PowerShell 3,0, можно создать объект из хэш-таблицы свойств и значений свойств.
Синтаксис выглядит следующим образом:
Этот метод работает только для классов, имеющих конструктор со значением NULL, то есть конструктор, не имеющий параметров. Свойства объекта должны быть общедоступными и настраиваемыми.
Дополнительные сведения см. в разделе about_Object_Creation.
Что такое hashtable
Такой тип данных как хэш таблицы вы встретите в любом языке программирования. Если в массивах мы используем только значение, то в хеш таблицах мы используем пару ключ и значение.
Пустой hashtasble объявляется так:
Обратите внимание на различие скобок с массивами.
На следующем примере мы добавим элемент в хэш таблицу выше:
В следующих примерах мы научимся получать элементы.
Powershell создание файлов и директорий
Изменение, добавление и удаление свойств
Мы не можем изменять объект так же как и с hashtable. При таких действиях мы получим ошибку:
- Не удается индексировать в объект типа System.Management.Automation.PSObject.
- Unable to index into an object of type System.Management.Automation.PSObject.
Для добавления свойств нужно использовать команду Add-Member:
Так же и меняется значение:
Если вы забудете указать ключ Force, то получите ошибку:
- Add-Member : Не удается добавить элемент с именем "key", так как элемент с таким именем уже существует. Чтобы все равно перезаписать этот элемент, добавьте в команду параметр Force.
- Add-Member : Cannot add a member with the name "key3" because a member with that name already exists. To overwrite the member anyway, add the Force parameter to your command.
Когда нужно удалить свойство используется метод remove:
При попытке удалить несуществующее значение появится ошибка:
- Невозможно вызвать метод для выражения со значением NULL
- You cannot call a method on a null-valued expression.
Дополнительные возможности с сортировкой
С командлетом сортировки тоже можно использовать выражения. Связи с этим по этим значениям можно и сортировать результат:
Пример выше сортирует пользователей AD по результату из функции.
Создание
Для создания объекта можно использовать два подхода. Первый работает с версии PS 3.0:
Либо использовать команду New-Object, но с большими данными он будет работать медленнее:
Если вы читали статью про создание hashtable в Powershell, то видели некоторые сложности с экспортом и форматированием обычных хэш таблиц, но использование PSCustomObject решает эти проблемы.
Доступ к данным можно получить так:
Все эти способы работают одинаково.
Добавление и удаление ключей и значений
Чтобы добавить ключи и значения в хэш-таблицу, используйте следующий формат команды:
Например, чтобы добавить в хэш-таблицу ключ "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.
Вложенные коллекции
Hashtable и массивы можно вкладывать:
Вызывать элементы можно так:
Добавление ключей и значений делается выше описанным способом:
Как видно по скриншоту ключи во вложенных хеш таблицах отображаются как Value. Если вы не знаете какой тип хранит таблица, то сможете узнать это через GetType():
С этим же примером, если мы не будем использовать GetType(), у нас выведутся все элементы:
Либо вызывать ключи обращаясь к конкретной коллекции:
Предположим, что нам нужно добавить значение в Support. На данный момент это строка, но мы сделаем массив:
Создание своих методов у объектов
Мы можем создать свой метод у таких объектов. На примере ниже я добавил скрипт, который будет возвращать имена свойств:
Так же сработает и со скриптом, который преобразовываем объект в хэш таблицу:
Как в Powershell сменить пароль локального пользователя и AD
Преобразование существующих hashtable
Если у вас уже создана хеш-таблица, то вы ее можете преобразовать следующим образом:
Если попытаться вывести эти таблицы, то можно заметить разницу в отображении данных:
Один из минусов работы с такими объектами в том, что порядок свойств может поменяться. Вы так же не сможете передавать такой объект в качестве параметров и аргументов команды.
Пример c созданием пользователей в AD
Для тестового стенда мне нужно создать 100 пользователей. Можно перечислить параметры в команде, но это усложнит читабельность:
Тип Powershell PSCustomObject - это еще один способ хранить структурированные данные наряду с массивами. Выбор в строну PSCustomObject более верен, когда нам нужно хранить не набор элементов, а объект. Кроме того этот объект будет быстрее работать.
Навигация по посту
Проверка на существование
Когда мы работаем с таким типом как hashtable важно убедиться, что ключ по которому мы обращаемся действительно существует. В большинстве языков это делается так:
Я предпочитаю вызывать все ключи и проверять, что в них есть нужный:
Так же есть метод, который проверяет, что в коллекции есть нужный ключ:
Такой же ключ есть для проверки значений:
Создание хэш-таблиц
Чтобы создать хэш-таблицу, следуйте приведенным ниже рекомендациям.
- Начните хэш-таблицу со знака @ @.
- Заключите хэш-таблицу в фигурные скобки ( <> ).
- Введите одну или несколько пар "ключ-значение" для содержимого хэш-таблицы.
- Используйте знак равенства ( = ) для отделения каждого ключа от его значения.
- Используйте точку с запятой ( ; ) или разрыв строки для разделения пар "ключ-значение".
- Ключи, содержащие пробелы, должны быть заключены в кавычки. Значения должны быть допустимыми выражениями PowerShell. Строки должны быть заключены в кавычки, даже если они не содержат пробелов.
- Чтобы управлять хэш-таблицей, сохраните ее в переменной.
- При назначении упорядоченной хэш-таблицы переменной поместите атрибут [ordered] перед @ символом. Если поместить его перед именем переменной, команда завершится ошибкой.
Чтобы создать пустую хэш-таблицу в значении $hash, введите:
При создании хэш-таблицы можно также добавить в нее ключи и значения. Например, следующая инструкция создает хэш-таблицу с тремя ключами.
Что такое массив
В основном этот тип используется когда мы получаем однородные данные, например листы или числа. Иногда в нем хранится разный тип данных в случаях, когда нельзя предположить какой будет вывод:
Вывод этих данных построчный:
Чаще всего они передаются через foreach или вызываются по индексам:
В массивах нельзя удалять и добавлять элементы, но можно делать обновление элементов, и сложение словарей (считайте добавление):
Hashtable как свойства
Чаще всего в Powershell бы работаем со свойствами и с коллекциями мы можем работать так же.
Сортировка ключей и значений
Элементы в хэш-таблице неупорядочены по отдельности. Пары "ключ-значение" могут отображаться в отдельном порядке при каждом их отображении.
Хотя хэш-таблицу нельзя отсортировать, можно использовать метод GetEnumerator хэш-таблиц для перечисления ключей и значений, а затем использовать командлет Sort-Object для сортировки перечисленных значений для вывода.
Например, следующие команды перечисляют ключи и значения в хэш-таблице в $p переменной, а затем сортируют эти ключи в алфавитном порядке.
Следующая команда использует ту же процедуру для сортировки хэш-значений в порядке убывания.
Отображение хэш-таблиц
Чтобы отобразить хэш-таблицу, сохраненную в переменной, введите имя переменной. По умолчанию хэш-таблицы отображаются в виде таблицы с одним столбцом для ключей и одной для значений.
Хэш-таблицы имеют свойства "ключи" и "значения". Используйте точечную нотацию для вывода всех ключей или всех значений.
Каждое имя ключа является также свойством хэш-таблицы, а его значением является значение свойства Key-Name. Используйте следующий формат для вывода значений свойств.
Если имя ключа конфликтует с одним из имен свойств типа HashTable, можно использовать PSBase для доступа к этим свойствам. Например, если имя ключа равно keys и необходимо вернуть коллекцию ключей, используйте следующий синтаксис:
Хэш-таблицы имеют свойство Count, которое указывает количество пар "ключ-значение" в хэш-таблице.
Таблицы хэш-таблиц не являются массивами, поэтому нельзя использовать целое число в качестве индекса в хэш-таблице, но можно использовать имя ключа для индексации в хэш-таблице. Если ключ является строковым значением, заключите имя ключа в кавычки.
10.1 Введение
Хэш-таблица представляет собой коллекцию пар объектов ключ-значение, которая поддерживает эффективное получение значения при индексировании по ключу. Каждая пара "ключ-значение" является элементом, который хранится в некоторых типах объектов, определяемых реализацией.
Ключ элемента не может быть значением NULL. Ограничения на тип ключа или значения отсутствуют. Повторяющиеся ключи не поддерживаются.
При наличии пары "ключ-значение" ключ и связанное значение этого объекта могут быть получены с помощью свойств экземпляра Key и Value соответственно.
При наличии одного или нескольких ключей соответствующие значения можно получить с помощью оператора индексирования хэш-таблицы [] (§ 7.1.4.3).
Все хэш-таблицы имеют тип Hashtable (§ 4.3.3).
Порядок ключей в коллекции, возвращенной свойствами Key, явно не определен. Однако он такой же, что и порядок связанных значений в коллекции, возвращаемой свойствами Value.
Ниже приведено несколько примеров, в которых используются хэш-таблицы.
Элементы Hashtable хранятся в объекте типа DictionaryEntry, а коллекции, возвращаемые свойствами Key и Value, имеют тип ICollection.
10.2 Создание хэш-таблицы
Объект Hashtable создается с помощью хэш-литерала (§ 7.1.9) или командлета New-Object. Его можно создать с нулевым или более количеством элементов. Свойство Count возвращает текущее количество элементов.
psobject.copy()
Если мы хотим создать копию объекта, например для изменения, нужно использовать следующий метод:
Таким образом у нас находятся два разных массива в памяти и изменение одного из них не повлияет на другой.
Сохранение в файл и загрузка
Мы можем сохранить коллекции в файл для дальнейшего использования. Я не нашел способов с помощью которых можно сохранить коллекции без преобразования. Один из способов использовать импорт и экспорт в формат xml:
Для загрузки выполним импорт:
Сохранить в CSV для последующей загрузки возможна, на мой взгляд, только с "костылями".
Можно использовать JSON, но так получится другой тип данных:
Как видно, в случае с JSON, мы больше не можем использовать элемент как параметр командной строки.
Если в файле находится коллекция исходного формата, то вы можете ее загрузить используя такие команды:
Основы по работе с хэш таблицами
Перед тем как перейти к описанию таблиц посмотрим как выглядит другой тип, который был подробно описан в предыдущей статье массивы и листы в Powershell.
Создание и получение свойств
Посмотрим как вызываются свойства обычных объектов в PS:
Аналогично этому примеру мы можем получать из коллекций:
Для создания новых свойств можно использовать такой же подход:
Создание упорядоченных словарей
Можно создать упорядоченный словарь, добавив объект типа ордереддиктионари , но самым простым способом создания упорядоченного словаря является использование [ordered] атрибута.
[ordered] Атрибут введен в PowerShell 3,0.
Поместите атрибут непосредственно перед символом "@".
Упорядоченные словари можно использовать так же, как и хэш-таблицы. Любой из этих типов можно использовать в качестве значения параметров, которые принимают хэш-таблицу или словарь (iDictionary).
Можно привести упорядоченный словарь к хэш-таблице, но нельзя восстановить упорядоченный атрибут, даже если очистить переменную и ввести новые значения. Для повторного создания заказа необходимо удалить и повторно создать переменную.
Подробное описание
Хэш-таблица, также называемая словарем или ассоциативным массивом, представляет собой компактную структуру данных, в которой хранится одна или несколько пар "ключ-значение". Например, хэш-таблица может содержать ряд IP-адресов и имен компьютеров, где IP-адреса являются ключами, а имена компьютеров — значениями, и наоборот.
В PowerShell каждая хэш-таблица является объектом Hashtable (System. Collections. Hashtable). В PowerShell можно использовать свойства и методы объектов Hashtable.
Начиная с PowerShell 3,0, можно использовать атрибут [ordered] для создания упорядоченного словаря (System. Collections. специализированные. ордереддиктионари) в PowerShell.
Упорядоченные словари отличаются от хэш-таблиц тем, что ключи всегда отображаются в порядке их перечисления. Порядок ключей в хэш-таблице не определен.
Хэш-таблицы часто используются, так как они очень эффективны для поиска и извлечения данных. Хэш-таблицы можно использовать для хранения списков и создания вычисляемых свойств в PowerShell. И PowerShell имеет командлет, ConvertFrom-StringData , который преобразует строки в хэш-таблицу.
Вывод hashtable как таблицы
Если вам нужно изменить вывод таким образом, что бы вместо имен колонок были ключи, то это можно сделать через PSCustomObject :
Так же сработает и после создания коллекции:
Можно использовать Out-GridView для представления в графическом интерфейсе:
Если будет интересно могу описать способ добавления hashtable в базу SQL с помощью Powershell и их вывод.
ConvertFrom-StringData
Здесь строки особенно полезны, если значения в хэш-таблице содержат кавычки. Дополнительные сведения о строках см. в разделе about_Quoting_Rules.
Следующая команда создает строку "ключ-значение", а затем сохраняет ее в $string переменной.
Эта команда использует ConvertFrom-StringData командлет для преобразования строки Here в хэш-таблицу.
Хеш таблицы в Powershell или Hashtable это отдельный тип данных, который позволяет удобно хранить значения. Хэш таблицы похожи на словари в Python или формат JSON. Кроме всего этого мы можем передавать этот тип в виде параметров команд. Мы разберем каждую особенность работы с ними на примерах.
Этот тип так же называется коллекциями и ассоциативным массивом. Такой тип данных является более гибким инструментом, чем обычные массивы. Они могут дополнять друг друга при работе в консоли.
Навигация по посту
Сортировка
По умолчанию hashtable не отсортированы. Это не очень важно, так как по умолчанию значения мы получаем по ключу, но это можно сделать так:
Вызов по нескольким ключам
Powershell позволяет вызывать несколько ключей одновременно:
Если мы присвоим такие значения переменной, то она будет хранить массив:
Синтаксис
Синтаксис хэш-таблицы выглядит следующим образом:
Синтаксис упорядоченного словаря выглядит следующим образом:
Атрибут [ordered] появился в PowerShell 3,0.
Типы объектов в хэш-таблицах
Следующая инструкция создает хэш-таблицу строк имени процесса и значения объекта Process и сохраняет их в $p переменной.
Можно отобразить хэш-таблицу в $p и использовать свойства Key-Name для вывода значений.
Ключи в хэш-таблице могут также иметь любой тип .NET. Следующая инструкция добавляет пару "ключ-значение" в хэш-таблицу в $p переменной. Ключ — это объект службы, представляющий службу WinRM, а значение — Текущее состояние службы.
Вы можете отобразить новую пару "ключ-значение" и получить к ней доступ с помощью тех же методов, которые используются для других пар в хэш-таблице.
Ключи и значения в хэш-таблице также могут быть объектами Hashtable. Следующая инструкция добавляет пару "ключ-значение" в хэш-таблицу в $p переменной, в которой ключ является строкой, Hash2, а значение — хэш-таблицей с тремя парами "ключ-значение".
Вы можете отображать новые значения и получать к ним доступ с помощью тех же методов.
Удаление ключей и значений
Для удаления ключей нужно использовать функцию .Remove():
Значение удалить нельзя, так как коллекции существуют только в паре. Можно обнулить подставив $null:
Удалить все элементы коллекции можно переназначив ее:
Или использовать функцию clear():
Создание объектов из хэш-таблиц
Начиная с PowerShell 3,0, можно создать объект из хэш-таблицы свойств и значений свойств.
Синтаксис выглядит следующим образом:
Этот метод работает только для классов, имеющих конструктор со значением NULL, то есть конструктор, не имеющий параметров. Свойства объекта должны быть общедоступными и настраиваемыми.
Дополнительные сведения см. в разделе about_Object_Creation.
Преобразование в 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
Что бы избежать этого нужно выполнять клонирование:
Аналогичный вариант с новой переменной:
Создание упорядоченных словарей
Можно создать упорядоченный словарь, добавив объект типа ордереддиктионари , но самым простым способом создания упорядоченного словаря является использование [ordered] атрибута.
[ordered] Атрибут введен в PowerShell 3,0.
Поместите атрибут непосредственно перед символом "@".
Упорядоченные словари можно использовать так же, как и хэш-таблицы. Любой из этих типов можно использовать в качестве значения параметров, которые принимают хэш-таблицу или словарь (iDictionary).
Можно привести упорядоченный словарь к хэш-таблице, но нельзя восстановить упорядоченный атрибут, даже если очистить переменную и ввести новые значения. Для повторного создания заказа необходимо удалить и повторно создать переменную.
Получение имен свойств
Мы можем вывести все свойства и методы у объекта таким же способом, каким получаем аналогичные данные у результатов команд:
Либо отобразить только имена:
Как вы можете заметить, что у нас не отображается метод, который удаляет значения. Часть методов, у этого типа объекта, скрыта.
Передача как параметров
Особенностью работы с хеш таблицами в Powershell это возможность их передачи через командную строку. На примере создания папки это выглядит так:
Иногда команды бывают очень длинными, что затрудняет чтение в скриптах. Мы можем изменить это представление передав параметры через коллекцию:
Таким образом мы можем передавать сразу несколько таблиц:
В командах и программах, где значения используются в виде /parametr:value тоже можно использовать такой подход. Для примера Robocopy:
Итерации, конвейеры и циклы
Связи с тем, что hashtable отличаются от массивов наличием ключей итерации делаются иначе.
Для примера, если мы передадим хэш таблицу через конвейер, то у нас отобразится количество объектов:
А если используем счетчик Count отобразится количество значений:
Мы можем вызвать отдельно ключи:
И отдельно значения:
Можно передавать эти значения сразу либо вызывать из конвейера. Для примера у меня есть таблица с возрастом и я могу вызвать эти элементы несколькими способами через конвейер:
Переменная $PSItem аналогична такому написанию $_ .
Мы редко работаем с хеш таблицами, где не знаем ключей. Если такая ситуация происходит, то мы обращаемся к циклам, которые берут каждый ключ и вызываем по нему значение. Далее будет описан способ как вызвать оба элемента сразу.
Преобразование в JSON
Как вы уже заметили хэш таблицы в Powershell сильно похожи на JSON. Если вам удобнее для хранения или использования этот формат, то вы сможете выполнить преобразование:
О том как выполнить обратное преобразование будет рассказано ниже.
Получение списка USB устройств в Powershell
Отображение хэш-таблиц
Чтобы отобразить хэш-таблицу, сохраненную в переменной, введите имя переменной. По умолчанию хэш-таблицы отображаются в виде таблицы с одним столбцом для ключей и одной для значений.
Хэш-таблицы имеют свойства "ключи" и "значения". Используйте точечную нотацию для вывода всех ключей или всех значений.
Каждое имя ключа является также свойством хэш-таблицы, а его значением является значение свойства Key-Name. Используйте следующий формат для вывода значений свойств.
Если имя ключа конфликтует с одним из имен свойств типа HashTable, можно использовать PSBase для доступа к этим свойствам. Например, если имя ключа равно keys и необходимо вернуть коллекцию ключей, используйте следующий синтаксис:
Хэш-таблицы имеют свойство Count, которое указывает количество пар "ключ-значение" в хэш-таблице.
Таблицы хэш-таблиц не являются массивами, поэтому нельзя использовать целое число в качестве индекса в хэш-таблице, но можно использовать имя ключа для индексации в хэш-таблице. Если ключ является строковым значением, заключите имя ключа в кавычки.
10.5 Хэш-таблицы как ссылочные типы
Так как Hashtable является ссылочным типом, назначение Hashtable включает неполную копию, т. е. назначенная переменная ссылается на ту же Hashtable ; копия Hashtable не создается. Например, примененная к объекту директива
Сортировка ключей и значений
Элементы в хэш-таблице неупорядочены по отдельности. Пары "ключ-значение" могут отображаться в отдельном порядке при каждом их отображении.
Хотя хэш-таблицу нельзя отсортировать, можно использовать метод GetEnumerator хэш-таблиц для перечисления ключей и значений, а затем использовать командлет Sort-Object для сортировки перечисленных значений для вывода.
Например, следующие команды перечисляют ключи и значения в хэш-таблице в $p переменной, а затем сортируют эти ключи в алфавитном порядке.
Следующая команда использует ту же процедуру для сортировки хэш-значений в порядке убывания.
Объекты и ссылки
Возможно вы знаете, что переменные не хранят сами значения, а только ссылки на них. Это можно убедиться на следующем примере:
В момент объявления $b = $a они не начинают хранить по 1, а ссылаются на один и тот же элемент. Исходя из этой ситуации в примере ниже мы изменим значение объекта:
Другие возможности
Сортировка коллекций в массиве
В статье по работе с массивами в Powershell мы рассказывали, что в них могут храниться объекты. Если там хранятся коллекции, то их тоже можно сортировать:
Типы объектов в хэш-таблицах
Следующая инструкция создает хэш-таблицу строк имени процесса и значения объекта Process и сохраняет их в $p переменной.
Можно отобразить хэш-таблицу в $p и использовать свойства Key-Name для вывода значений.
Ключи в хэш-таблице могут также иметь любой тип .NET. Следующая инструкция добавляет пару "ключ-значение" в хэш-таблицу в $p переменной. Ключ — это объект службы, представляющий службу WinRM, а значение — Текущее состояние службы.
Вы можете отобразить новую пару "ключ-значение" и получить к ней доступ с помощью тех же методов, которые используются для других пар в хэш-таблице.
Ключи и значения в хэш-таблице также могут быть объектами Hashtable. Следующая инструкция добавляет пару "ключ-значение" в хэш-таблицу в $p переменной, в которой ключ является строкой, Hash2, а значение — хэш-таблицей с тремя парами "ключ-значение".
Вы можете отображать новые значения и получать к ним доступ с помощью тех же методов.
Получение и добавление элементов
В отличие от массивов, где мы получали элементов по индексам в hashtable это делается по ключам:
В предыдущих примерах мы добавляли параметры через add, но мы можем использовать и другой синтаксис:
Можно сложить две коллекции, но при условии что ключи не совпадают так как они должны быть уникальными:
ConvertFrom-StringData
Здесь строки особенно полезны, если значения в хэш-таблице содержат кавычки. Дополнительные сведения о строках см. в разделе about_Quoting_Rules.
Следующая команда создает строку "ключ-значение", а затем сохраняет ее в $string переменной.
Эта команда использует ConvertFrom-StringData командлет для преобразования строки Here в хэш-таблицу.
Нотация ~opt~ в определениях синтаксиса указывает, что лексическая сущность в синтаксисе необязательна.
Изменения свойства TypeName
Если у созданного объекта мы выполним следующую команду, то увидим имя, которое было дано по умолчанию:
Выражения
В одной из предыдущих статей мы вычисляли свободное место на диске с помощью Powershell, где использовалась такая команда:
Как вы можете видеть выражение, которые переводит KB в GB, имеет вид хэш таблиц. Мы их можем использовать и другим способом:
Label - это имя колонки, а знак $_ элемент, который передается через конвейер.
Выражения можно использовать в командах, которые позволяют это делать. Это команды типа Select-Object и Format-Table
Создание хэш таблиц со значениями
Еще одно небольшое отличие от того, что в других языках называется словарями, использования знака = между ключом и значением. Так мы создадим заполненную хеш таблицу:
Использование точки с запятой не обязательно когда вы пишете на следующей строке, но рекомендуется.
Проверка в условиях
Перед вызовом свойств обычно делается проверка на существование. Так мы можем выполнить проверку значения:
Либо использовать еще один скрытый метод:
GetEnumerator()
Я не помню ситуаций, когда в таких типах данных как ассоциативный массив мне приходилось бы получать ключ и значение сразу, но и такая возможность есть:
Использование как справочной информации
Хэш таблицы удобно использовать как справочник. Пример ниже позволит узнать на каком сервере вы находитесь сейчас. Вместо значений можно вставить пути до скриптов, которые будут выполнять тестирование:
$env:COMPUTERNAME вернет имя компьютера из окружения и будет использоваться как ключ для получения данных из хэш таблицы.
10.6 Перечисление по хэш-таблице
Для обработки каждой пары в Hashtable сначала с помощью свойства Keys получите список ключей в виде массива, а затем выполните перечисление по элементам этого массива, получая соответствующие значения с помощью свойства Value или индекса, как показано ниже.
Описывает создание, использование и сортировку хэш-таблиц в PowerShell.
Синтаксис
Синтаксис хэш-таблицы выглядит следующим образом:
Синтаксис упорядоченного словаря выглядит следующим образом:
Атрибут [ordered] появился в PowerShell 3,0.
Читайте также: