Windows PowerShellКопнем глубже
Дон Джонс (Don Jones)
Оболочка Windows PowerShell содержит множество полезных функций, о которых многие администраторы попросту забывают. Если как следует разобраться, можно найти очень удобные возможности. Даже я сам зачастую нахожу новые возможности в командлетах, которые, как мне казалось, я знал вдоль и поперек.
Метод обучения Windows PowerShellTM, где я преподаю, я рекомендую сделать администраторам календарь, на каждой страничке которого описывался бы командлет дня — наподобие обычного отрывного календаря. Если есть такой календарь, то можно утром каждого дня (естественно, только не в выходные) потратить несколько минут, чтобы ознакомиться со всеми возможностями командлета. В Windows PowerShell содержится около 130 командлетов, то есть можно узнать обо всех функциях и возможностях Windows PowerShell примерно за полгода, если каждый день изучать по одному. После этого можно будет перейти к командлетам Exchange Server 2007.
В этой статье я приведу несколько примеров того, что можно найти и чего можно добиться, если потратить всего несколько минут на изучение возможностей командлетов.
Красивые отчеты в HTML
Один из редко используемых командлетов — ConvertTo-HTML. Этот «умник» принимает набор входных объектов — службы, процессы, объекты Windows® Management Instrumentation (WMI) и т.д., — и превращает их в таблицу HTML. Затем можно передать эту таблицу HTML в командлет Out-File, и в результате получается HTML-страница, пригодная для размещения на веб-сервере в интрасети. Например, на каждое утро можно запланировать запуск следующей команды:
Gwmi Win32_Service | Where { $_.StartMode –eq "Auto" –and $_.State –ne "Running" } | ConvertTo-HTML | Out-File C:\ServiceAlert.html
Эта команда будет создавать отчет HTML, подобный изображенному на рис. 1. В отчете будут указаны службы, которые должны запускаться автоматически, но не запущены.
Figure 1** An HTML report of services that aren't running **(Щелкните изображение, чтобы увеличить его)
При этом может возникнуть естественное желание сделать отчет покрасивее. К счастью, командлет ConvertTo-HTML выдает «чистый» код HTML, то есть не внедряет в создаваемый код теги форматирования. По правилам языка HTML не следует использовать форматирование в коде (его там должно быть как можно меньше). Форматирование следует разместить во внешней таблице стилей (CSS) и связать таблицу стилей с HTML. Такую ссылку можно сделать с помощью ConvertTo-HTML.
Ссылка на таблицу CSS указывается в разделе <HEAD> HTML-файла. Синтаксис команды ConvertTo-HTML, описанный в справке, содержит параметры, на которые вы могли не обращать внимания раньше:
ConvertTo-Html [[-property] <Object[]>] [-inputObject <psobject>] [-body <string[]>] [-head <string[]>] [-title <string>] [<CommonParameters>]
Параметр -head предназначен для того, чтобы указать дополнительный HTML-код, который нужно вставить в раздел <HEAD> сценария. Теперь изменим мою команду, чтобы указать ссылку на существующий CSS-файл, содержащий форматирование для таблицы HTML:
Gwmi Win32_Service | Where { $_.StartMode –eq "Auto" –and $_.State –ne "Running" } | ConvertTo-HTML -title "Services" -head "<link rel='stylesheet' href='styles.css' type='text/ css' />" | Out-File C:\ServiceAlert.html
Здесь я применил параметр -head для вставки ссылки на CSS-файл, находящейся в той же папке, что и выходной HTML-файл. Параметр -title использовался, чтобы указать название страницы. Результат показан на рис. 2. Текст использованного мной файла Style.CSS такой:
Figure 2** An HTML report that is formatted with a CSS file **(Щелкните изображение, чтобы увеличить его)
body { background-color:#EEEEEE; } body,table,td,th { font-family:Tahoma; color:Black; Font-Size:10pt } th { font-weight:bold; background-color:#CCCCCC; } td { background-color:white; }
Удобная фильтрация
Командлет месяца
В этом месяце я расскажу о паре командлетов: Start-Transcript и Stop-Transcript. Оба командлета используются для управления ведением журнала Windows PowerShell (весь текст, появляющийся в окне консоли, записывается в указанный текстовый файл). Командлеты работают довольно просто. Запустите Start-Transcript, указав имя файла. Затем запустите Stop-Transcript, чтобы завершить ведение журнала и закрыть файл. Это очень удобно при переходе от произвольного использования оболочки к формальным сценариям: после того, как вам удастся создать нужные командные строки в оболочке, их можно будет просто скопировать из созданного файла журнала. А можно, конечно же, отредактировать файл журнала, отставив в нем только команды сценария. Мой коллега Джеффри Хикс (Jeffery Hicks) написал сценарий, анализирующий журналы и преобразующий их в PS1-файлы для Windows PowerShell. Этот сценарий находится по адресу blog.sapien.com/current/2006/11/28/powershell-transcripts.html.
Теперь поговорим о командлете Get-WMIObject. В справке Windows PowerShell описываются все функции этого командлета, многие из которых редко используются:
Get-WmiObject [-class] <string> [[-property] <string[]>] [-namespace <string>] [-computerName <string[]>] [-filter <string>] [-credential <PSCredential>] [<CommonParameters>]
Можно отметить одну общую ошибку всех новичков, применяющих Windows PowerShell — запуск следующей команды WMI:
Gwmi Win32_NTLogEvent –comp Server2
Эта команда получает записи журнала событий с сервера Server2. Все записи. Выполнение этой задачи сервером Server2 займет довольно много времени, да и оболочке Windows PowerShell потребуется время, чтобы сделать что-нибудь полезное с таким большим объемом данных.
Разумнее сделать так, чтобы сервер Server2 находил и отправлял только важные события. Для этого можно использовать запрос на языке WQL (языке запросов WMI). Некоторым синтаксис такого запроса покажется сложным, но в Windows PowerShell с помощью параметра -filter можно указать только ту часть запроса WQL, которая отвечает за фильтрацию.
Gwmi Win32_NTLogEvent –comp Server2 –filter "EventIdentifier=1024"
Эта команда получает все события из всех журналов с кодом события 1024. Обратите внимание, что в условии фильтра в качестве оператора сравнения используется «=», а не оператор Windows PowerShell -eq. Дело в том, что фильтр передается для обработки в службу WMI удаленного компьютера, поэтому условие нужно указывать с помощью синтаксиса WMI, а не синтаксиса Windows PowerShell.
Параметр -filter есть и в других командлетах, таких как Get-ChildItem, используемого в псевдонимах Dir и Ls. Параметр -filter обычно передает условие фильтра непосредственно на нижележащий уровень, то есть фильтрация выполняется в источнике. Это намного быстрее, чем передача всех объектов с последующим запуском командлета Where-Object, чтобы отфильтровать ненужные объекты.
Забытые командлеты
Изучение по одному командлету каждый день поможет лучше понять командлеты, которые вы уже считали хорошо знакомыми. Еще один важный довод в пользу ежедневного календаря с командлетами: это надежный способ узнать о командлетах, о которых вы при отсутствии такого календаря вообще бы не узнали. Один из моих любимых командлетов, которым многие не пользуются — Resolve-Path. Этот командлет возвращает набор имен файлов и папок, соответствующих указанному пути. Он схож с командлетом Get-ChildItem (то есть с хорошо известными псевдонимами Dir и Ls), но возвращает не целые файлы и папки, а текстовые строки, которые можно передать в другие командлеты для фильтрации и обработки. Использовать этот командлет очень просто:
Resolve-Path C:\P*
Эта команда возвратит пути, такие как C:\Program Files, C:\Processes.txt и т. д. На рис. 3 показаны два примера использования этого командлета.
Figure 3** Using the handy, though overlooked, Resolve-Path cmdlet **(Щелкните изображение, чтобы увеличить его)
Начните с начала
В самом начале работы с календарем «командлет дня» запустите Gcm — псевдоним командлета Get-Command. Вы получите список всех командлетов Windows PowerShell, включая добавленные через надстройки, например Exchange Server 2007 Management Shell, PowerShell Community Extensions и т. д. Выберите первый в списке, к примеру, Add-Content, и прочтите справку:
Help Add-Content –full
Вам понадобится полный текст справки, а не более сжатая справка по умолчанию. Можно получить полное описание всех параметров, посмотреть примеры использования командлетов и узнать другие подробности. Попробуйте поэкспериментировать с командлетом. (Для этого лучше использовать виртуальную систему, чтобы не повредить рабочую среду). Рекомендую тратить на это 10 минут каждый день, причем в одно и то же время, чтобы это стало привычкой. После этого вы за кратчайшее время овладеете всеми функциями и возможностями Windows PowerShell.
Дон Джонс (Don Jones) — ведущий специалист по написанию сценариев компании SAPIEN Technologies, соавтор книги «Windows PowerShell: TFM» (изд-во SAPIEN Press, 2007 г.). С ним можно связаться по адресу www.ScriptingAnswers.com.
© 2008 Корпорация Майкрософт и компания CMP Media, LLC. Все права защищены; полное или частичное воспроизведение без разрешения запрещено.