Powershell создание хэш таблицы
Описывает создание, использование и сортировку хэш-таблиц в 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, которая отличает его от других языков, это работа с конвейером. Дело в том, что каждая команда в Powershell возвращает множество объектов, а не один объект типа строка. Такой метод дает дополнительные возможности для работы с языком. Конвейер так же называют pipe или pipeline. В это статье будут рассмотрены примеры работы конвейера, его сравнение с bash, отличие от циклов и создание функции принимающей данные с конвейера.
Навигация по посту
Как работает конвейер
Если бы мы использовали конвейер с буквами, то получилось бы следующее:
В примере ниже слева указана строка, которая выводится через команду справа:
Предыдущий пример идентичен, по функциональности и результату, следующему выполнению:
Суть в том, что мы можем указать несколько значений в левой части. Каждое из этих значений будет передаваться асинхронно (т.е. отдельно). Значения, которые разделяются запятыми в Powershell, образуют массив:
В командах без конвейера мы редко можем использовать массивы в качестве значений. Что бы получить результат аналогичный предыдущей команде мы должны вызвать ее дважды:
Так мы получим только день из сегодняшней даты:
stdin, stdout и stderr
Если вам сложно понять работу конвейера с примеров выше вы можете ознакомиться с понятием потоков (streams). Потоки реализованы в *nix системах и Windows. В Powershell реализовано 7 потоков, но основная концепция понятна в 3 потоках, которые так же реализованы в *nix системах. Это:
- stdin - ввод данных. Этот поток используется, когда вы печатаете текст или, например, когда результат работы одной команды принимает следующая. На уровне Powershell этого потока нет (в документациях не указывается, но скорее всего он реализован на уровне ОС);
- stdout - вывод результата. Этот результат может быть направлен на экран консоли, в файл, в другую команду и т.д. В powershell этот поток называется "Success Stream";
- stderr - вывод ошибок. В Powershell называется "Error Stream".
Пример работы этих потоков в обычном виде:
В 1-ом случае мы используем stdin т.к. напечатали команду с клавиатуры. После вызова команды мы получили stdout (2). При ошибках мы получаем stderr.
В конвейере работает такой же принцип:
Разница конвейеров bash и Powershell
Разница работы конвейеров в типе объектов, которые через них проходят. В Powershell, в подавляющем большинстве, возвращается (попадают в stdout) массивы следующего вида:
Благодаря этому мы можем сразу получать нужное свойство не использовав сложные конструкции и регулярные выражения:
Bash же отправляет в stdout информацию в виде строки:
Так как это сплошной текст - нам приходится использовать дополнительные механизмы для поиска нужных данных. Например grep:
Есть и другие отличия. Например в Powershell есть переменные, в которые и помещаются данные конвейера: $PSItem или $_. Часть из таких возможностей будет рассмотрена далее.
Различия с циклом
Пайп схож с циклами, но более автоматизирован. Что бы с помощью цикла получить название дисков, а затем изменить цвет вывода, мы должны сделать следующее:
У нас использован совершенно обычный цикл, который есть во всех языках. Мы объявляем переменную "$item", в которую помещается временное значение. Это значение мы отдельно выводим. Т.е. мы выполняем 3 действия:
- Объявление цикла;
- Объявление переменной с текущим значением;
- Вывод переменной (или другие действия, например сохранение данных в файл).
В Powershell реализован так же команда-цикл "ForEach-Object". Особенность этой команды в том, что используется только часть возможности конвейера и часть от обычного цикла:
Как можно увидеть с примера выше у нас исчез шаг под номером 2. Мы больше не объявляем временную переменную - она формируется автоматически под именем "PSItem". Эта переменная появляется во время передачи данных через pipeline. В нее помещается результат работы "Get-PSDrive".
Конвейер убирает еще, как минимум, один шаг. Нам не нужно объявлять цикл - мы просто вызываем переменную:
В некоторых случаях мы можем не указывать "PSItem" вовсе. Обычно это команды одного типа, например, работы с сервисом:
Как принимаются данные с конвейера
Если мы выполним следующую команду, то увидим, что у нее есть множество свойств (левая колонка), которые мы можем вернуть:
Вопрос в том, как конвейер узнает, что нам нужно использовать свойство "Name" в "Restart-Service"? В одной команде множество свойств и значений, а другой множество параметров и они могут не совпадать. У нас так же не возвращаются какие-либо ошибки.
Что бы понять как будут распределены свойства и значения нам нужно посмотреть справку по этой команде:
- ByPropertyName - по свойству (должен быть использован массив ключ-значение);
- ByValue - по значению (одномерный массив).
Не все команды возвращают PSCustomObject. Это говорит о том, что вы можете использовать и другие типы объектов:
Главный принцип, по которому значение может таким образом успешно попасть в конвейер, это быть итерируемым. В hashtable такого по умолчанию нет.
hashtable
Не все объекты Powershell могут проходить через конвейер. Как написано в документации у всех типов Powershell, кроме hashtable, есть поддержка работы через конвейеры (IEnumerable). При попытке пропустить хэш-таблицу через конвейер возникнет ошибка:
- Get-Service : Не удается найти службу с именем службы "System.Collections.Hashtable".
Еще два способа получить только ключи или только значения:
Создание функции работающей через Pipeline
Еще один способ понять работу конвейера - это создать собственную команду (функцию). Мы можем объявить два параметра, которые могут быть использованы вместе, так и отдельно:
Эти параметры мы можем совмещать, так и указывать отдельно:
В отличие от предыдущего способа, ValueFromPipelineByPropertyName мы можем использовать множество раз. Самое главное использовать правильные названия переменных и ключей:
Мы можем комбинировать параметры ValueFromPipelineByPropertyName и ValueFromPipeline. Я бы рекомендовал избегать таких способов т.к. в них легко запутаться:
Обратите внимание на помеченные фрагменты. Мы должны определять тип данных, который ожидается (случай 1 и 2) иначе конвейер не будет обрабатывать некоторые данные корректно. Так же, в случае 3, у нас выводится только последний элемент. Это происходит из-за отсутствия Process.
Блок Process
При создании функций в Powershell вы можете использовать блоки: begin, process и end. В большинстве случаев это не требуется и вы можете писать функцию по принципам описанным выше. В случае конвейеров эти блоки приобретают дополнительный смысл:
- begin - значение, переданное через конвейер, этому блоку не известно. Оно будет равно $null либо другому значению по умолчанию, которое вы установите;
- process - обрабатывает каждый элемент переданные через конвейер отдельно;
- end - обрабатывает только последний элемент переданный через конвейер. Если вы не указывали какие-то блоки, как в примере выше, по умолчанию используется именно этот блок. Из-за этого выводится только последний элемент массива.
Пример работы всех блоков:
Там, где использовался конвейер, появился 0. Это связано с тем, что блоку begin не известна эта переменна, т.е. это значение равно $Null. Т.к. эта переменная должна хранить число, а не строку, этот тип преобразовывается в 0:
Если для вас это слишком сложная конструкция, то вы можете использовать только блок Process. В случае обычных использований команды он вызывается единожды, а в случае конвейера - для каждого значения отдельно. Важно отметить, что вы не должны писать код вне Process:
Массивы
Вы наверняка использовали команды, которые позволяют использовать следующую конструкцию:
Используя примеры выше у вас не получится организовать такую возможность. У вас появится ошибка в первом случае т.к. ожидается число, а вы передаете массив:
- Не удается обработать преобразование аргументов для параметра "param". Не удается преобразовать значение.
Если вам нужно передавать именованные параметры, то нужно будет организовывать дополнительные проверки. Я не рекомендую использовать такие сложные конструкции.
Асинхронное выполнение
Конвейер Powershell передает значения асинхронно. Это значит, что несколько функций будут работать друг с другом еще до завершения своей работы. Это так же может быть важно в отдельных случаях.
В примере ниже видно, что мы передаем значения из массива постепенно, а не целиком. У нас чередуется выполнение функций (a,b,a. ):
Ошибки
При создании конвейеров легко запутаться и получить странную ошибку. Часть из них рассмотрена ниже.
- Не удается привязать объект ввода к любым параметрам команды, так как команда не принимает входные данные конвейера, либо входные данные и их свойства не совпадают с любыми из параметров, принимающих входные данные конвейера;
- 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.
Если вы укажете код вне блока Process, то так же получите странную ошибку:
Хеш таблицы в Powershell или Hashtable это отдельный тип данных, который позволяет удобно хранить значения. Хэш таблицы похожи на словари в Python или формат JSON. Кроме всего этого мы можем передавать этот тип в виде параметров команд. Мы разберем каждую особенность работы с ними на примерах.
Этот тип так же называется коллекциями и ассоциативным массивом. Такой тип данных является более гибким инструментом, чем обычные массивы. Они могут дополнять друг друга при работе в консоли.
Навигация по посту
Основы по работе с хэш таблицами
Перед тем как перейти к описанию таблиц посмотрим как выглядит другой тип, который был подробно описан в предыдущей статье массивы и листы в Powershell.
Что такое массив
В основном этот тип используется когда мы получаем однородные данные, например листы или числа. Иногда в нем хранится разный тип данных в случаях, когда нельзя предположить какой будет вывод:
Вывод этих данных построчный:
Чаще всего они передаются через foreach или вызываются по индексам:
В массивах нельзя удалять и добавлять элементы, но можно делать обновление элементов, и сложение словарей (считайте добавление):
Что такое hashtable
Такой тип данных как хэш таблицы вы встретите в любом языке программирования. Если в массивах мы используем только значение, то в хеш таблицах мы используем пару ключ и значение.
Пустой hashtasble объявляется так:
Обратите внимание на различие скобок с массивами.
На следующем примере мы добавим элемент в хэш таблицу выше:
В следующих примерах мы научимся получать элементы.
Powershell создание файлов и директорий
Получение и добавление элементов
В отличие от массивов, где мы получали элементов по индексам в hashtable это делается по ключам:
В предыдущих примерах мы добавляли параметры через add, но мы можем использовать и другой синтаксис:
Можно сложить две коллекции, но при условии что ключи не совпадают так как они должны быть уникальными:
Создание хэш таблиц со значениями
Еще одно небольшое отличие от того, что в других языках называется словарями, использования знака = между ключом и значением. Так мы создадим заполненную хеш таблицу:
Использование точки с запятой не обязательно когда вы пишете на следующей строке, но рекомендуется.
Использование как справочной информации
Хэш таблицы удобно использовать как справочник. Пример ниже позволит узнать на каком сервере вы находитесь сейчас. Вместо значений можно вставить пути до скриптов, которые будут выполнять тестирование:
$env:COMPUTERNAME вернет имя компьютера из окружения и будет использоваться как ключ для получения данных из хэш таблицы.
Вызов по нескольким ключам
Powershell позволяет вызывать несколько ключей одновременно:
Если мы присвоим такие значения переменной, то она будет хранить массив:
Итерации, конвейеры и циклы
Связи с тем, что hashtable отличаются от массивов наличием ключей итерации делаются иначе.
Для примера, если мы передадим хэш таблицу через конвейер, то у нас отобразится количество объектов:
А если используем счетчик 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():
Другие возможности
Сортировка
По умолчанию 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 пользователей. Можно перечислить параметры в команде, но это усложнит читабельность:
Описывает создание, использование и сортировку хэш-таблиц в 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 в хэш-таблицу.
Читайте также: