И красиво, и интересно, и полезно

7 июль, 2006 - 14:46Андрей Зубинский

Лето – очень неподходящее время для того, чтобы на досуге «долгими холодными вечерами» изучать не очень интересную, но полезную 1200-страничную книгу. Поэтому давайте попробуем обойтись без книг, всего тремя бесплатными программами, получение дистрибутивов которых потребует каких-то несчастных 5 MB трафика...

О некогда новой командной оболочке Monad для ОС Microsoft Windows мы уже давно писали. C тех пор минуло достаточно времени для того, чтобы сама оболочка сменила название (теперь она именуется PowerShell), прошла несколько серьезных стадий доработки и достигла уровня релиз-кандидата, и наконец, стала привлекательной для создателей больших программных систем. При этом PowerShell по сей день остается и тем, чем она задумывалась – главным средством автоматизации решения административных задач в ОС Windows нового поколения, и... совершенно необласканной вниманием разработкой. Последнее, к слову, не является парадоксом и имеет достаточно логичное объяснение – отточенная за десятилетия эксплуатации различных версий системы Windows ее «пользовательская составляющая» привела к тому, что большинство прикладных программ для нее достигли столь высоких уровней насыщенности скрытой функциональностью и специализацией, что требовать от их пользователя еще и «системного программирования по ходу дела» – то же самое, что требовать от системного программиста по ходу дела выполнять профессиональную цветокоррекцию фотоснимков. И все же, доподлинно известно, что PowerShell станет очень важной подсистемой будущих ОС семейства Windows, поэтому минимальные, «полупользовательские» навыки работы с этой весьма специфической системой никому не помешают. А в качестве летнего бонуса за усилия, потраченные на чтение статьи, мы сделаем из PowerShell украшение вашей системы, в летнюю жару особенно ярко подчеркивающее повышенный интеллектуальный статус ее владельца.

Консоль

Начнем мы с программы, которая при работе в командной оболочке постоянно «торчит перед глазами». С консоли. Внешность которой в штатном исполнении в Windows до умопомрачения скучна. Увы, эту совершенно нелетнюю скукотищу не исправить ни настройками цветовой гаммы, ни тщательным подбором шрифтов. Конечно, от консоли и не требуется рюшиков и бантиков, но ведь за окном лето, и раз вы решились напрячься и зачем-то что-то сделать с консолью, то хотя бы ради восхищенного «Вау, что это у тебя?» при виде экрана вашего компьютера (и ни на секунду не сомневайтесь – в «модных» консольных программах ОС UNIX этот «вау-фактор» тоже не забыт).

И красиво, и интересно, и полезно
Не только пользователей UNIX радуют полупрозрачная консоль и мощный командный язык

Раз внешность штатной консоли не исправить, то обратимся к ее заменителям. Их, увы, не просто немного, а почти что и нет. Но нам этого «почти что» – полумегабайтового дистрибутива бесплатной программки с неказистым названием Console (sourceforge.net/projects/console) – более чем достаточно. Console довольно неспешно, но уверенно развиваемая программа, версия релиза которой на момент написания статьи имеет цифровой индекс «1.5». Она не требует инсталляции – просто распакуйте содержимое архива дистрибутива в какой-либо каталог (например, в C:Program FilesConsole). Увы, с документированием своего детища разработчики Console не особенно дружат, поэтому перед первым запуском давайте ознакомимся с файлами, входящими в поставку программы. Единственный исполняемый файл, естественно, в комментариях не нуждается. inf-файл, который также один (речь идет о версии программы 1.5), позволяет одним движением добавить пункт «Запуск консоли здесь» (Console Here) в общесистемном меню Explorer, вызываемом нажатием правой кнопки мыши. Такая возможность очень полезна, поэтому инсталляция console.inf – первое, что вы должны сделать в каталоге с распакованной Console (нажатие правой кнопки мыши на console.inf и выбор пункта меню Install). Файлы с расширением xml описывают различные конфигурации программы. При запуске Console она автоматически считывает конфигурацию из файла с именем console.xml, прочие конфигурации можно выбрать интерактивно с помощью соответствующего меню. Для достижения высокого «вау-эффекта» с летними затратами как-нибудь переименуйте файл console.xml, чтобы потом вы могли вспомнить, что это была штатная стандартная конфигурация, а console_small.xml – соответственно, в console.xml. В этом файле измените строку, задающую размер консоли в символах (значений 10×80 недостаточно), например, так:

Вот теперь можно первый раз запустить программу. Согласитесь, полученный в результате несложных манипуляций полупрозрачный блок консоли разительно отличается от тоскливой штатной реализации. Более того, если вы используете какой-либо грамотно разработанный менеджер виртуальных экранов (например, VirtuaWin), запущенная Console автоматически будет отображаться на всех виртуальных экранах. Если вы не хотите, чтобы случайное нажатие кнопки мыши в корневом окне «поднимало» Console поверх всех окон, можете изменить ее положение «по глубине» в оконной системе ОС Windows (конфигурационный файл console.xml):

...
regular
 

Впоследствии, когда настанут долгие зимние вечера, вы сможете на досуге почитать файл Readme.txt, в котором худо-бедно, но описан конфигурационный язык Console, и добиться куда более эффектных персональных настроек программы.

О запущенной Console достаточно сказать, что ее пользовательское меню активируется нажатием правой кнопки мыши – в остальном программа совершенно очевидна. К сказанному выше остается лишь добавить, что Console полноценно поддерживает Unicode (вопрос ее общесистемной интеграции мы рассмотрим несколько позже).

PowerShell

C базовыми понятиями PowerShell можно ознакомиться в ранее опубликованной статье, поэтому мы кратко повторим самое важное и перейдем к практике. Естественно, подразумевается, что вы имеете дистрибутив PowerShell (его легко отыскать на сайте Microsoft) и на вашем рабочем компьютере установлена среда исполнения (runtime) .NET второй версии. Хоть установка пакета тривиальна, следует упомянуть одну маленькую деталь – несмотря на неизменность последней доступной версии PowerShell (RC1) она претерпела несколько существенных изменений, влияющих на работоспособность рекомендованных далее в статье программ. Поэтому если у вас есть «завалявшийся» старенький дистрибутив PowerShell RC1, обновите его с сайта Microsoft – в конце концов, это всего лишь два с небольшим мегабайта.

И красиво, и интересно, и полезно
Интегрированная среда разработки командных сценариев PowerShellIDE

Итак, первая принципиальная особенность PowerShell, о которой в явном виде не говорится в документации и немногочисленных книгах, но которая очень важна в практике применения командной оболочки, заключается в четком разграничении между интерактивным режимом работы и написанием скриптов. Для создания повторно используемых сложных командных сценариев PowerShell предлагает мощный язык с избыточным синтаксисом, направленным на повышение «читабельности» кода. Такой «нехакерский» подход на самом деле трудно назвать неправильным – скрипты административного назначения одновременно очень ценны для повторного использования и очень опасны при модификациях (которые в жизни любой программы, даже скрипта, неизбежны). И чем менее «читабелен» скриптовый язык, тем больше неожиданных «радостей» могут принести модификации написанных на нем сложных сценариев. История знает немало примеров злых шуток, когда хитромудрые скрипты, например на Perl, с замаскированным особенностями синтаксиса и семантики этого языка злонамеренным кодом, использовались в качестве вирусов, распространяемых методом социальной инженерии («Не понимаю, как этот код работает, гуру, подскажите!»). Если же говорить о потерях времени, вызванных необходимостью разбираться в нечеловеческом по силе и выразительности унаследованном коде, то тут уже никакой статистики нет и быть не может – потому как это ежедневная постоянная практика.

Но если многословный избыточный синтаксис полностью оправдан при неспешном программировании автоматизирующих решение ответственных административных задач скриптов, то интерактивная работа, напротив, требует эффективной лаконичности. Граница, разделяющая два режима работы в PowerShell, – механизм сокращенных имен, или алиасов (alias). Система поставляется с некоторым количеством заранее назначенных алиасов, и первое, что вы можете сделать в интерактивном режиме, запустив PowerShell, – просмотреть весь их список командой get-alias. Как видите, сокращенные имена действительно коротки – от двух до четырех-пяти символов. Увы, в перечне предустановленных алиасов нет самой главной команды, с которой традиционно начинается работа с любым командным интерпретатором в ОС UNIX. Естественно, команды man, позволяющей просматривать сопровождающую документацию. Давайте создадим свою man с помощью выполнения следующей команды:

set-alias man get-help

Попробуйте набрать вышеприведенный текст в консоли следующим образом – сначала введите set-al и нажмите Tab. Интерпретатор запустит механизм расширенного автодополнения (reach tab completion), отыщет в именах «командлетов» (cmdlets) начинающееся со введенных вами символов и подставит полное имя – Set-Alias.

Теперь, когда у вас в руках есть команда команд – man, пора начинать знакомиться с PowerShell. Все разделы встроенной помощи отображаются следующей командной строкой:

man *

Перечень ознакомительных руководств по синтаксису, концепциям, техникам и приемам работы в PowerShell выдает следующая команда:

man about*

К слову, «подсистема помощи» PowerShell использует для хранения информации обычные текстовые файлы, и никто не запрещает вам ее расширять, например, «лакомыми кусочками» (snippets) – автор статьи именно так и поступает, сохраняя интересные фрагменты о PowerShell в корневом каталоге программы и присваивая им имена на основании шаблона snippet_название_фрагмента.help. В таком случае команда

man snippet*

выдает перечень всех накопленных «кусочков».

Прочитать конкретное руководство можно, естественно, командой man имя_руководства, например, начинать дальнейшее ознакомление стоит с изучения man Command_syntax.

Но погодите. Где же теперь та красотища, которой мы добивались с помощью программы Console? Где «вау-эффект»? Для его достижения создайте системную переменную окружения с именем ComSpec и присвойте ей значение – полный путь к файлу powershell.exe (при инсталляции с параметрами по умолчанию это путь C:\Program Files\Windows PowerShellv1.0\powershell.exe). После перезагрузки вашего компьютера вы получите одновременно и красивую консоль, и мощный командный язык. Вот, например, полезная конструкция на этом языке, позволяющая удобно просматривать каталоги с большим числом файлов:

ls | group-object $_.Extension

В ней ls – удобный и знакомый для пользователя любого командного интерпретатора из мира UNIX алиас, скрывающий за собой команду, отправляющую в канал дочерние объекты текущего объекта, в данном случае – каталога файловой системы (на самом деле упрятанная за ls команда Get-ChildItem намного мощнее). Через канал (символ «|») объекты подаются на вход команды group-object, которая группирует объекты в зависимости от значения указанного свойства объекта. В нашем случае для объекта, переданного через канал, указано свойство – расширение имени файла. Пара символов $_ в PowerShell является эквивалентом ключевого слова this во многих объектно-ориентированных языках, а полную запись $_.Extension в данном примере следует читать так: «свойство Extension этого (this) объекта, переданного через канал». Результат исполнения всей конструкции куда более информативен, чем неструктурированный список, выдаваемый ls.

Для тех, кто хорошо знаком с традиционным командным интерпретатором ОС Windows (cmd.exe), подспорьем в быстром освоении PowerShell будет неполный перечень аналогий (таблица).

Теперь давайте добьемся еще одного украшения своей командной оболочки, а именно, научимся настраивать то немногое в ней, что подлежит настройке, в соответствии со своими прихотями. Для этого наберите PowerShell следующую команду:

cd ~

и выполните ее. Как и в большинстве командных оболочек, она переместит вас в так называемый «домашний каталог». Именно отсюда, из подкаталога My DocumentsPSConfiguration, PowerShell считывает файл с персональными пользовательскими настройками оболочки profile.ps1. Шаблон этого файла прост и состоит из нескольких неявно обозначенных секций (с обозначением комментария в PowerShell вы уже знакомы):

# заданные пользователем алиасы
set-alias man get-help
# заданные пользователем функции,
# в том числе – переопределенные специальные
function prompt  «$((get-date).Month)/$((get-date).Day) «
function day  (get-date).Day
# изменение емкости буфера,
# в котором хранится история пользовательского ввода
$MaximumHistoryCount=2048
# приглашение
«Привет из Редмонда, « + $env:Username

Но прежде чем получить плод вашего тюнинга, убедитесь в том, что командная оболочка вообще разрешает вам... неинтерактивно выполнять скрипты. Да-да, PowerShell различает политики управления безопасностью для интерактивного и пакетного режимов! Проверьте текущую политику выполнением команды Get-ExecutionPolicy. Если система ответит вам Restricted (а при установках по умолчанию она именно это вам и ответит) – увы, вам можно только работать в интерактивном режиме. Щадящая пользователя и одновременно относительно неплохо защищающая компьютер политика безопасности RemoteSigned (выполняются все скрипты и конфигурационные файлы, кроме поступающих от коммуникационных приложений) устанавливается очевидной командой:

Set- ExecutionPolicy RemoteSigned
Power Shell – cmd.exe
  PowerShell Традиционный командный файл
Комментарий # текст комментария REM текст комментария
Условный оператор If (условие) действие IF условие действие
Проверка наличия файла по полному путевому имени test-path полное_путевое_имя EXIST полное_путевое_имя
Запуск исполнения скрипта, хранящегося в файле & полное_путевое_имя CALL полное_путевое_имя
Пауза до указания пользователем о продолжении исполнения read-host ‘Нажмите Enter' PAUSE

И все же это не игрушка

PowerShell, одновременно объединяющий ряд концепций из некогда считавшихся полярными миров (интерактивных командных оболочек, объектно-ориентированных языков программирования, пакетных командных процессоров и т. д.), – вовсе не игрушечная программная система. И с ее помощью можно разрабатывать очень сложные скрипты. Но большие возможности требуют и адекватной инструментальной поддержки, и для PowerShell она уже существует – интегрированная среда разработки PowerShellIDE. Эта бесплатно распространяемая программа так же, как и Console, не требует инсталляции. После ее «установки» (например, в каталог c:Program FilesPowerShell IDE), создайте в PowerShell следующий алиас:

set-alias ide ‘c:Program FilesPowerShell IDEPowerShellIDE.EXE'

Теперь ваша интегрированная среда будет запускаться командой ide (а приведенная выше строка определения алиаса претендует на место в файле profile.ps1).

PowerShellIDE позволяет в рамках одного приложения работать как с интерактивной командной оболочкой (закладка «...Interactive»), так и со множеством редакторов командных файлов с подсветкой синтаксиса. Кроме мощного редактора, поддерживающего ускоренный ввод имен функций и фильтров и автоматические подсказки, IDE позволяет в режиме реального времени инспектировать значения и типы хранящихся в переменных объектов, производить пошаговую отладку и наблюдать-документировать консольный вывод. Кроме того, с помощью IDE можно вести персональную коллекцию повторно используемых фрагментов кода (snippets) и обмениваться информацией с сообществом разработчиков на PowerShell.

Итак, тремя перечисленными пакетами вы сформировали свой командный интерпретатор и среду разработки. У вас есть красивая консоль, в которой работают радующие глаз и сердце команды ls, pwd, cd, echo, и даже clear очищает ее от накопившегося в ходе экспериментов мусора. Что делать дальше? Microsoft распространяет исчерпывающий пакет руководств Windows PowerShell RC1 Documentation Pack, существуют специализированные тематические блоги. В общем, информации вполне достаточно для того, чтобы начать полноценное самостоятельное изучение этой перспективной и интересной технологии.