Windows PowerShell: Сплаттинг

Объединение параметров в пакет перед их передачей в команду позволяет экономить время, но только при использовании последней версии Windows PowerShell.

Дон Джонс

Где еще, кроме отрасли ИТ, можно использовать такое слово, как «сплаттинг» в серьезном профессиональном смысле? Возможно в замене лобовых стекол, но больше нигде.

В Windows PowerShell термином «сплаттинг» (splatting) обозначают способ объединения параметров перед передачей их в команду. Эта возможность появилась в Windows PowerShell 2.0. Если вы все еще возитесь с версией 1 (к примеру потому, что используете Exchange Server 2007, которому она нужна), эта статья не для вас.

Старый способ

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

Get-WmiObject –computername SERVER-R2 –class Win32_LogicalDisk –filter "DriveType=3" –credential "Administrator"

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

Get-WmiObject –comp SERVER-R2 –cla Win32_LogicalDisk –filt "DriveType=3" –cred "Administrator"

Есть еще параметры, позиция которых строго определена. Почитав справку по Get-WmiObject, вы обнаружите, что параметр –class всегда идет первым. Это означает, что не нужно указывать даже имя параметра, если его значение находится в нужном месте:

Get-WmiObject Win32_LogicalDisk –comp SERVER-R2 –filt "DriveType=3" –cred "Administrator"

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

Gwmi Win32_LogicalDisk –comp SERVER-R2 –filt "DriveType=3" –cred "Administrator"

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

Некоторые редакторы сценариев, такие как SAPIEN PrimalScript и Quest PowerGUI (с бесплатной оснасткой), позволяют даже «разворачивать» имена командлетов или параметров, превращая сокращения в полные версии. Это позволяет безопасно сокращать имена.

Новый способ

Сплаттинг — совершено новый способ передачи параметров в команды. Сначала создается хеш-таблица, которую еще называют словарем или ассоциативным массивом. Хеш-таблица представляет собой набор пар <ключ>=<значение>. Базовая хеш-таблица содержит два ключа, у каждого по одному значению. В Windows PowerShell это выглядит так:

@{'key1'='value1';'key2'='value2'}

Символ «собака» (@) обозначает начало хеш-таблицы, которая заключается в фигурные скобки, которые выглядят так: { }. Пары <ключ>=<значение> отделяются друг от друга точкой с запятой. В механизме сплаттинга ключами являются имена параметров, а в значениях передаются значения, передаваемые в параметры. В сценарии для повышения читабельности в хеш-таблице можно даже использовать разрывы строк:

$parms = @{'class'='Win32_BIOS';
        'computername'='SERVER-R2';
           'filter'='drivetype=3';
   'credential'='Administrator'
          }

Для передачи параметров в команде снова используется символ «@». На сей раз он действует как оператор сплаттинга. Поначалу может смущать тот факт, что один символ используется в разных качествах, но это работает:

Get-WmiObject @parms

Легко заметить небольшой нюанс: за символом «собака» следует имя переменной, не содержащее символ доллара. Здесь стоит остановиться чуть подробнее. Это сбивает с толку очень многих.

В Windows PowerShell имя переменной может состоять только из букв, цифр и символов подчеркивания. Обычно разрешается в имени переменной использовать пробелы и другие знаки пунктуации, но это выглядит ужасно. Символ доллара перед именем переменной говорит оболочке, что важно не имя, а сама переменная. Планируется работать с ее содержимым. Так выражение $var = 5 присваивает число «5» переменной по имени var.

Используемый в сплаттинге символ «собака» делает что-то похожее. Он говорит:«Примите все входящие символы и считайте, что это имя переменной. Считайте, что переменная содержит хеш-таблицу, а ее ключи являются названиями параметров. Разверните их передайте значения из хеш-таблицы в соответствующие параметры». Звучит длинновато, но именно это и происходит.

Некоторые полагают, что в сценарии это:

$parms = @{'class'='Win32_BIOS';
        'computername'='SERVER-R2';
           'filter'='drivetype=3';
           'credential'='Administrator'
          }
Get-WmiObject @parms

…выглядит лучше, чем это:

Get-WmiObject –computername SERVER-R2 –class Win32_LogicalDisk –filter "DriveType=3" –credential "Administrator"

Это вопрос личных предпочтений. Преимущества сплаттинга очевидны. Все параметры — и имена, и значения — аккуратно располагаются в одном месте. Можно их отформатировать, так чтобы они выглядели упорядоченно и аккуратно («упорядоченно и аккуратно» — основная тема моих курсов).

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

Don Jones

Дон Джонс (Don Jones) носит звание MVP, пишет книги и преподает. Связаться с Доном можно через его сайт ConcentratedTech.com, на котором также можно найти информацию о читаемых им курсах и докладах на конференциях.

Боковая колонка: Windows PowerShell на видео

К этой статье прилагается видеоролик, который доступен по ссылке Magazine Extras - Concentrated Technology. Также много других бесплатных видеосюжетов по теме Windows PowerShell вы найдете на сайте YouTube - ConcentratedDon's Channel.

Истекает время регистрации на эксклюзивный практический семинар Джонса, совмещенный с TechMentor Spring 2011. Подробные сведения см. на веб-сайте TechMentorEvents.com.

Дополнительные материалы