Помимо других замечательных функций, у Windows PowerShell есть встроенная возможность выводить результат работы командлета в формате HTML. Достаточно передать результат работы по конвейеру в ConvertTo-HTML, а затем — в Out-File, чтобы сохранить результат в файле. Например, так:
Get-WmiObject –Class Win32_Service |
Select-Object –property Name,State |
Where-Object –Filter { $_.StartMode –eq 'Auto' –and $_.State –ne 'Running' } |
ConvertTo-HTML |
Out-File BadNews.html
Это даст нам список служб, которые должны быть запущены, но не работают. Лучше всего эту информацию размещать на интрасетевом файловом сервере, чтобы сотрудники службы поддержки проверяли этот файл каждое утро. Кстати, при вводе этой команды с клавиатуры не забудьте, что первые четыре строки завершаются символом конвейера (|). Последняя строка завершается возвратом каретки.
Если вы будете вводить команду в интерактивном режиме в оболочке, то заметите, что после ввода символа конвейера в первой строке и нажатия Enter приглашение сменится на «>>». Это нормально. Это означает, что Windows PowerShell ожидает ввода следующей строки. После ввода последней, четвертой строки дважды нажмите Enter, чтобы сообщить оболочке, что ввод завершен и команду можно выполнять.
Но с командлетом ConvertTo-HTML есть одна проблема: он умеет работать только с одним типом выходных данных за раз. Если попытаться передать в командлет несколько объектов разных типов — службы, процессы и записи в журнале событий, он не отформатирует результат надлежащим образом.
Если нужно создать что-то типа консолидированного отчета, придется прибегнуть к уловке и использовать разные параметры командлета. Допустим, вы хотите создать отчет, содержащий список служб, которые остановлены, хотя должны работать. Также надо создать страницу с сотней последних записей в журнале событий безопасности, перечнем всех процессов на сервере и некоторой базовой информацией о самом сервере.
Надо знать две вещи: во-первых, иметь представление о параметре –Fragment командлета ConvertTo-HTML (о нем можно узнать из справочного файла командлета) и, во-вторых, знать, что командлет не пишет HTML в файл.
Как и в первом примере, командлет помещает HTML-код в конвейер, а для передачи в файл нужен дополнительный шаг. В первом примере это выглядит громоздко, но позволяет нам написать следующее:
$one = Get-WmiObject -class Win32_Service |
Select-Object -property Name,State |
Where-Object -filter { $_.Mode -eq 'Auto' -and $_.State -ne 'Running' } |
ConvertTo-HTML -Fragment
$two = Get-EventLog -LogName Security -newest 100 |
ConvertTo-HTML -Fragment
$three = Get-Process |
ConvertTo-HTML -Fragment
$four = Get-WmiObject -class Win32_OperatingSystem |
Select-Object -property Caption,BuildNumber,ServicePackMajorVersion,
@{n='LastBootTime';e={$_.ConvertToDateTime($_.LastBootUpTime)}} |
ConvertTo-HTML -Fragment
ConvertTo-HTML -Body "$one $two $three $four" -Title "Server Status" |
Out-File c:\status.html
При вводе этой команды с клавиатуры завершайте символом конвейера все строки за исключением последней, которую надо завершить нажатием Enter. Здесь выполняются четыре разные команды, каждая из которых получает определенную порцию данных и преобразует их в HTML-фрагмент.
HTML-фрагмент представляет собой длинную строку HTML-кода, в котором нет заголовочных тегов, без которых страница не считается полной. На последнем этапе я просто внедряю полученный HTML-код в тело полноценной страницы, которую затем вывожу в файл.
Попытайтесь выполнить то же самое и посмотрите, что произойдет. Это очень просто. Иногда шутят, что Windows PowerShell — единственный продукт Microsoft, генерирующий «чистый» HTML-код без добавления каких-либо стилей или форматирования. Недостаток заключается в том, что такой код довольно скучен. Так и было задумано. Ожидается, что вы его сами приукрасите с использованием отдельного CSS-файла.
В HTML форматирование применяется к тегам <td>. Это теги строк таблицы. Тегами <th> отмечаются заголовки столбцов таблицы. Тег <body> можно использовать для определения формата по умолчанию всей страницы. Создайте текстовый файл Style.css и введите в него следующий текст:
body {
font-family:Calibri;
font-size:10pt;
}
th {
background-color:black;
color:white;
}
td {
background-color:#666;
color:black;
}
А теперь я видоизменю последнюю команду с командлетом ConvertTo-HTML так:
ConvertTo-HTML -Body "$one $two $three $four" -Title "Server Status" -CssUri c:\style.css |
Out-File c:\status.html
Здесь надо ввести две строки, и снова первая завершается символом конвейера. Попытайтесь выполнить всю обновленную команду. Результат будет выглядеть намного приятнее. К сожалению, CSS не позволяет применить стиль к разным строкам таблицы, по крайней мере, это нельзя сделать в HTML-коде, создаваемом PowerShell.
Можно воспользоваться параметрами –PreContent и –PostContent командлета ConvertTo-HTML, чтобы добавить заголовки разделов и любой другой необходимый текст. Это позволит сделать отчет намного более читабельным. Все переданные в параметре –PreContent строки будут размещены перед таблицей, а в параметре –PostContent — после таблицы. С примерами можно познакомиться, выполнив в оболочке команду Help ConvertTo-HTML –example.
Это замечательный пример того, как средствами Windows PowerShell можно создавать полезные отчеты, которые затем можно передавать коллегам или партнерам. Не требуется много работы, чтобы создать прилично выглядящие HTML-документы. Сохраняя полученные страницы на интрасетевом файловом сервере, можно предоставлять доступ к ним сотрудникам, менеджерам и всем, кому они могут понадобиться.