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

Я уже рассказывал о Set-ADuser – всемогущей команде PowerShell с незамысловатым синтаксисом, служащей для редактирования характеристик учетной записи пользователя. Например, команда установки должности Engineer для пользователя Paul выглядит так:

set-aduser Paul -title Engineer

Команда проста, легко читаема, а ее выполнение занимает меньше времени, чем запуск графического интерфейса для выполнения той же операции. Однако учетные записи Active Directory (AD) имеют свыше ста атрибутов (и даже больше при добавлении Exchange Server в схему AD). Хотя есть такие параметры, как -title, -manager и т.п., разработчики службы каталогов не для каждого атрибута создали параметры (к примеру, не существует параметра -countrycode). Впрочем, разработчики не могли так создать параметры для каждого атрибута учетных записей, чтобы в случае изменения схемы AD (опять же, например, при добавлении Exchange) не было бы возможности узнать, какие параметры нужны.

Именно поэтому был создан параметр –replace, позволяющий изменить любой атрибут учетной записи AD, в том числе добавленный впоследствии. С помощью этого параметра можно также изменять несколько атрибутов одновременно, например:

set-aduser –replace @{title=«Writer»; middlename=«Jerome»; mail=«mark@nospam.com»}

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

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

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

@{name1=«value1»; name2=«value2»; name3 = «value3»…}

Запись начинается с @{, затем идут пары имя/значение, разделенные знаком равенства. Значения заключаются в кавычки (если это текст), и одна пара отделяется от другой точкой с запятой. Созданную хэш-таблицу можно сохранить в переменной и вывести ее для просмотра, например:

PS C:\> $h = @{bug=«insect»;roses=«red»;height=«31"}
PS C:\> $h
Name Value
---- -----
roses red
bug insect
height 31

В хэш-таблицу можно добавлять записи. Например, ввод $h=$h+@{shoesize=«13E»} даст четвертую запись в нашей таблице. Где это может пригодиться? Рассмотрим снова команду Set-ADuser -replace. Для хэш-таблицы нет ограничений. Предположим, что у нас есть объемная таблица изменений атрибутов учетных записей AD. Экспортируем ее в файл CSV (понятный для PowerShell формат) и считаем записи для данного пользователя, строя хэш-таблицу изменений его учетной записи. Если сохранить имя учетной записи пользователя в переменной $uname и собрать изменения атрибутов в хэш-таблицу под названием $attchange, внести изменения будет совсем просто:

set-aduser $uname –replace $attchange

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

get-aduser –filter {enabled –eq $false} –searchbase»OU=TPs,DC=bigfirm,dc=com«–properties title,office

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

$p=@{Filter =»Enabled -eq '$false'«; searchbase=»dc=bigfirm,dc=com«; properties=(»Title«,"Office»)}

Теперь достаточно ввести

get-aduser @p

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

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