Назад | Перейти на главную страницу

Преобразование в HTML вывода Powershell

Я работал над сценарием Powershell, который генерирует электронную почту события резервного копирования Windows. Проблема в том, что форматирование выглядит плохо.

Subject: Computer name status [backup was successful]

Tuesday, December 29, 2015 2:55 AM
Index              : 19160
EntryType          : Warning
InstanceId         : 4099
Message            : Backup was cancelled.
Category           : (0)
CategoryNumber     : 0
ReplacementStrings : {}
Source             : Windows Backup
TimeGenerated      : 29-Dec-15 12:42:35 PM
TimeWritten        : 29-Dec-15 12:42:35 PM
UserName           :

Хотелось бы иметь красочный HTML-отчет.

Вот сценарий

$Event = Get-eventlog -log application -Newest 1 -source "Windows Backup"
$Status= $Event.Message 
$From = "email@email.com"
$To = "email@email.com"
$SMTPServer = "smtp"
$SMTPPort = "port"
$Username = "email"
$Password = "***"
$Subject = "$computer, $status"
$Body =  $event | format-list  | out-string
$smtp = New-Object System.Net.Mail.SmtpClient($SMTPServer, $SMTPPort);
$smtp.EnableSSL = $false
$smtp.Credentials = New-Object System.Net.NetworkCredential($Username, $Password);
$smtp.Send($From, $To, $subject, $body); 
$computer = "$env:computername"

Ключевое изменение, которое вы захотите сделать, - это преобразование объекта в строку. Прямо сейчас вы используете format-list где вы захотите использовать другой конвертер, например, FormatTo-HTML командлет. Вот техническая статья о FormatTo-HTML и некоторая документация по FormatTo-HTML с ss64.com

Вы можете ссылаться на файл css с помощью -cssuri, но это только ссылка, поэтому использовать локальный файл не особо полезно. Вместо этого вы можете включить html <style/> элемент в строке, переданной в -head флаг.

FormatTo-HTML имеет свои ограничения, например, не создает чередующихся стилей строк для окраски, но может подойти для ваших нужд.

Дополнительно вам необходимо установить IsBodyHTML свойство в сообщении. Для этого вам нужно создать объект MailMessage вместо использования System.Net.Mail.SmtpClient::Send чтобы создать его для вас. Например:

$mailMsg = new-object  System.Net.Mail.MailMessage $From $To
$mailMsg.Subject = "$computer, $status"
$mailMsg.IsBodyHTML = $true
$mailMsg.Body = $event | FormatTo-HTML -title "System Status for $computer" | out-string
$smtp.Send($mailMsg)