Windows PowerShell: Снова об отчетах

OSzone.net » Microsoft » PowerShell » Windows PowerShell: Снова об отчетах
Автор: Дон Джонс
Иcточник: TechNet Magazine
Опубликована: 21.06.2012

Если вам приходится создавать отчеты средствами Windows PowerShell, самодостаточные HTML-отчеты намного предпочтительнее простых текстовых отчетов. В пользу этого говорит много аргументов: HTML-отчеты существенно проще создавать, они выглядят лучше простого текста и их так же просто включать в сообщения электронной почты и пересылать заинтересованным лицам.

Несколько месяцев тому назад в этой рубрике я давал советы по созданию HTML-отчетов средствами Windows PowerShell. В этой статье я расскажу, как можно улучшить такие отчеты.

Сразу перейдем к коду (рис. 1). Его нужно сохранить в файл сценария и назначить ему имя, например C:\Report.ps1.

Рис. 1. Улучшение HTML-отчетов, созданных средствами Windows PowerShell

param([string]$computername)

$b =  Get-WmiObject -class Win32_ComputerSystem -ComputerName $computername |
	Select-Object -Property Manufacturer,Model,
					@{n='Memory(GB)';e={$_.TotalPhysicalMemory / 1GB -as [int]}},
					@{n='Architecture';e={$_.SystemType}},
					@{n='Processors';e={$_.NumberOfProcessors}} |
	ConvertTo-HTML -Fragment -As LIST -PreContent "<h2>Computer Hardware:</h2>" |
Out-String

$b += Get-WmiObject -class Win32_LogicalDisk -ComputerName $computername |
	Select-Object -Property @{n='DriveLetter';e={$_.DeviceID}},
					 @{n='Size(GB)';e={$_.Size / 1GB -as [int]}},
					 @{n='FreeSpace(GB)';e={$_.FreeSpace / 1GB -as [int]}} |
	ConvertTo-Html -Fragment -PreContent "<h2>Disks:</h2>" |
Out-String

$b += Get-WmiObject -class Win32_NetworkAdapter -ComputerName $computername |
Where { $_.PhysicalAdapter } |
	Select-Object -Property MACAddress,AdapterType,DeviceID,Name |
	ConvertTo-Html -Fragment -PreContent "<h2>Physical Network Adapters:</h2>" |
Out-String

$head = @'
<style>
body { background-color:#dddddd;
	 font-family:Tahoma;
	 font-size:12pt; }
td, th { border:1px solid black;
	   border-collapse:collapse; }
th { color:white;
     background-color:black; }
table, tr, td, th { padding: 2px; margin: 0px }
table { margin-left:50px; }
</style>
'@

ConvertTo-HTML -head $head -PostContent $b -Body "<h1>Hardware Inventory for $ComputerName</h1>"

Приведенный на рис. 1 код создания отчета запускается так:

C:\Report –computername localhost > output.htm

Вот что здесь происходит: я использую вызовы Get-WmiObject для получения информации. При этом каждый раз я использую Select-Object для выбора нужных мне свойств. В большинстве случаев я создаю пользовательские столбцы, чтобы значения, например объем памяти, отображался в боле удобных единицах измерения.

В конце каждого этапа я использую ConvertTo-HTML для получения HTML-фрагмента. Это означает, что я получаю нужный мне HTML-код для создания таблицы с нужными мне свойствами.

Здесь есть один прием, который я не сразу обнаружил. Результат работы ConvertTo-HTML выглядит очень странно. По сути этот командлет выдает набор строк.  Но если вы попытаетесь передать это в конечный командлет ConvertTo-HTML, то получите ошибку.

Я решал эту проблему средствами Out-String. Как видите, в каждом из трех блоков я передаю HTML-фрагменты по конвейеру в Out-String. Это гарантирует, что каждый фрагмент является только набором простых строк. Готовый HTML-фрагмент я добавляю в переменную $b.

Также обратите внимание, что я использую ConvertTo-HTML для создания заголовков разделов в этих HTML-фрагментах. Обычно ConvertTo-HTML просто вставляет «предварительное содержимое» как простой текст. Я добавляю теги <h2>, чтобы заголовки разделов выглядели, как обычные заголовки в HTML.

После создания этих трех разделов я создаю встроенный список HTML-стилей. Здесь можно определить стили, которые придадут окончательный вид отчету. Подробнее о языке каскадных таблиц стилей CSS (Cascading Style Sheet) см. Если нужны сравнительно простые стили, работать с CSS несложно.

В последней строке сценария используется командлет ConvertTo-HTML. Я вставляю таблицу стилей в заголовок HTML-страницы, добавляю основной заголовок и вставляю содержимое переменной $b. Окончательный вид HTML страницы в Internet Explorer показан на рис. 2.

*

Рис. 2. Вид после изменения таблицы стилей и преобразования результата в HTML

Вот несколько моментов, на которые я хотел бы обратить внимание:

  1. Обратите внимание, что в первых двух командах Select-Object я использовал синтаксис хеш-таблиц, чтобы построить выходные пользовательские свойства. В большинстве случаев я просто создаю чуть усовершенствованные имена выходных столбцов. Но в трех случаях приходится выполнять вычисления, чтобы преобразовать байты в гигабайты.
  2. В первой части, где я обращаюсь к Win32_ComputerSystem, я использую ConvertTo-HTML для форматирования информации в виде списка, а не табличного стиля по умолчанию (параметр –As LIST). Так как результат содержит сведения только об одном компьютере, такое представление выглядит аккуратнее.
  3. Мне приходится немного повозиться с таблицей стилей, чтобы результат приобрел нужный мне вид. CSS — мощное средство, но требует дополнительных усилий, чтобы добиться нужного вида.

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

Например, я создал пользовательскую функцию, которая позволяет передавать информацию по конвейеру в HTML. При этом на основе содержимого контейнера создается сообщение электронной почты в формате HTML. Так как сценарий оставляет HTML-текст в конвейере, я могу передать его в функцию отправки почты, сохранить в файле или использовать для любых других целей. Простой вывод HTML-текста в конвейер гарантирует мне максимальную гибкость.

Кроме того, я не использую командлет Write-Host, который отправляет результат непосредственно на экран. Он не дает возможности перенаправить выходной текст в файл, превратить в сообщение электронной почты или сделать что-либо еще.

За счет использования ConvertTo-HTML мне удается заставить Windows PowerShell выполнить всю работу по форматированию выходного текста. С ним все равно дополнительно работать. За счет использования CSS я могут с легкостью изменить вид окончательного результата.

Можно даже предусмотреть разные таблицы стилей для отображения на экране и для вывода на печать. Таким образом, можно настроить стили так, чтобы документ выглядел аккуратно на бумаге. Для этого вам понадобиться таблица стилей подобная той, что приведена на рис. 3.

Рис. 3. Для отображения на экране и печати можно использовать разные таблицы стилей

$head = @'
<style media='screen'>
body { background-color:#dddddd;
       font-family:Tahoma;
       font-size:12pt; }
td, th { border:1px solid black;
         border-collapse:collapse; }
th { color:white;
     background-color:black; }
table, tr, td, th { padding: 2px; margin: 0px }
table { margin-left:50px; }
</style>
<style media='print'>
// Put alternate hardcopy styles here
</style>
'@

Это отличный способ построения отчетов, потому что при этом в полной мере используются модели и приемы Windows PowerShell. Отчет легко расширить, добавив в него дополнительную информацию. Сценарий создания отчета сравнительно простой и удобен в поддержке. Кроме того, каждый раздел отчета представлен одной (хотя и длинной) командой Windows PowerShell, что позволяет легко менять их, переставлять и использовать повторно.


Ссылка: http://www.oszone.net/18267/