В статье «От однострочной команды PowerShell — к сценарию», опубликованной в предыдущем номере, мы превратили очень длинный (но полезный) однострочный фрагмент кода в текстовый файл, сохранили его (присвоив файлу такое имя, как C:\scripts\fdns.ps1, где fdns — это аббревиатура Fix DisplayNames, а. ps1 — расширение для сценариев PowerShell) и тем самым создали простой сценарий PowerShell:
get-aduser -filter * -properties * | foreach { set-aduser $_ -displayname ($_.givenname + «" + $_.sn)}
В той статье я показал, что хотя полученный в результате сценарий почти так же малопонятен, как и исходный однострочный фрагмент, вызывать его легче, потому что вводить с клавиатуры имя сценария (C:\scripts\fdns) намного проще, чем приведенную выше исполинскую конструкцию. К сожалению, аргумент»проще вводить с клавиатуры«- не вполне убедительное оправдание для переноса однострочного фрагмента в текстовый файл с расширением. ps1, поэтому давайте рассмотрим еще ряд соображений.
Один более сильный аргумент состоит в том, что сценарии позволяют преобразовывать неэстетичные длинные однострочные фрагменты в серии более коротких — и более простых для понимания — строк. А когда сценарий читается относительно легко, у автора чаще возникает желание расширить и усовершенствовать его. В результате повышается вероятность того, что вы найдете время для оснащения своего сценария дополнительными возможностями. К примеру, у вас может возникнуть желание изменить его таким образом, чтобы очистка DisplayName осуществлялась в масштабах данной организационной единицы (OU), а не в рамках всего домена. Еще один вариант: вы, возможно, захотите, чтобы сценарий сообщал обо всех новых значениях DisplayName. У вас может даже возникнуть желание поступить как заправский программист и снабдить сценарий комментариями — короткими и легко читаемыми пояснениями относительно того, что именно сценарий пытается сделать. Но вне зависимости от того, какую цель вы преследуете, преобразуя однострочный фрагмент кода, ваша первоначальная задача — превратить его в последовательность более коротких строк.
Первый способ разбиения однострочного фрагмента сводится к разделению его на две строки: на левой стороне конвейера помещается строка, собирающая определенные элементы, а на правой стороне — строка, выполняющая над этими элементами определенные операции. Напомним, что большинство однострочных фрагментов выглядят таким образом:
(С помощью get-something извлекаем некоторые объекты/учетные записи) | (осуществляем над ними определенные операции)
Подобный однострочный фрагмент может быть разбит на две строки так:
$имя_некоторой_переменной = [команда, обеспечивающая извлечение объектов]
$имя_некоторой_переменной | [команда или команды, обеспечивающие выполнение над этими объектами определенных операций]
В рассматриваемом примере часть, обеспечивающая извлечение объектов, — это get-aduser -filter * -properties *, а часть, касающаяся выполнения операций, — это весь фрагмент текста, начиная со слова foreach и до конца. Чтобы воспользоваться данной формулой, выберите имя переменной — сгодится любое имя, хотя будет лучше, если оно будет описательным (например, $allusers), и в конце концов вы получите две такие строки:
$allusers= ( get-aduser -filter * -properties *) $allusers| foreach { set-aduser $_ -displayname ($_.givenname +» «+ $_.sn)}
Впечатайте эти две строки в другой текстовый файл, назначьте ему имя, скажем, C:\scripts\test2.ps1, создайте тестовую среду AD и в этой среде введите символы C:\scripts\test2. В итоге вы получите новый набор DisplayNames.
Как же все это работает? Напомним, что имена переменных должны начинаться с символа $ и что эти имена представляют не более чем участки в памяти, в которых временно хранятся те или иные значения. Get-aduser (первая команда) обеспечивает считывание пользовательских объектов, а первая строка содержит копию всех пользовательских объектов соответствующего домена. Попробуйте ввести $allusers и нажать клавишу ввода, и на экране отобразятся сведения обо всех ваших пользователях. Вторая строка начинается с символов $allusers |, и она обеспечивает не отображение всех пользователей на экране, а помещение их в конвейер, где эти пользователи будут переданы в правую часть однострочного фрагмента. Переменная лишь облегчает разделение строки на две части.
Итак, вы создали двустрочный сценарий. Что это дает? Во-первых, теперь вы можете вводить комментарии. Комментарий — это произвольный текст, помещенный после символа»решетка«(#). PowerShell игнорирует все символы, введенные после #. Теперь вы можете «облагородить» сценарий с помощью нескольких комментариев:
#DisplayName Fixer
#Собирает имена и фамилии всех пользователей домена, соединяет их с помощью пробелов
#и записывает комбинацию имя/фамилия
#поверх DisplayName.
#В результате AD ИЗМЕНЯЕТСЯ. Запускайте команду только в том случае, если вы точно знаете, что делаете!
#
#Прежде всего, поместите все учетные записи пользователей AD во временную переменную UsersFound:
$UsersFound = ( get-aduser -filter * -properties *)
# Теперь, когда вы собрали их вместе, передайте эти учетные записи пользователей команде set-aduser:
$UsersFound | foreach { set-aduser $_ -displayname ($_.givenname +» " + $_.sn)}
Есть все основания утверждать, что, подвергнув однострочный фрагмент некоторым преобразованиям (выделив в две отдельные строки части get objects и modify objects, а также снабдив сценарий комментариями высокого уровня), вы получили более удобочитаемый код. Но вы можете сделать и больше, если возьмете последовательность в правой части конвейера и в свою очередь распределите ее по нескольким строкам. Мы займемся этим в следующей статье.