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

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

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

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. Все права защищены; полное или частичное воспроизведение без разрешения запрещено.