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) носит звание MVP, пишет книги и преподает. Связаться с Доном можно через его сайт ConcentratedTech.com, на котором также можно найти информацию о читаемых им курсах и докладах на конференциях.
Боковая колонка: Windows PowerShell на видео
К этой статье прилагается видеоролик, который доступен по ссылке Magazine Extras - Concentrated Technology. Также много других бесплатных видеосюжетов по теме Windows PowerShell вы найдете на сайте YouTube - ConcentratedDon's Channel.
Истекает время регистрации на эксклюзивный практический семинар Джонса, совмещенный с TechMentor Spring 2011. Подробные сведения см. на веб-сайте TechMentorEvents.com.