Converta para HTML a saída de Powershell

3

Eu tenho trabalhado em um script Powershell que gera e-mail do evento de backup do Windows. O problema é que a formatação parece ruim.

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           :

Eu gostaria de ter um relatório HTML colorido.

Aqui está o script

$Event = Get-eventlog -log application -Newest 1 -source "Windows Backup"
$Status= $Event.Message 
$From = "[email protected]"
$To = "[email protected]"
$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"
    
por jacksh 29.12.2015 / 10:21

1 resposta

4

A mudança de chave que você desejará fazer é durante a conversão de objeto para string. No momento, você está usando format-list onde deseja usar um conversor diferente, por exemplo, o cmdlet FormatTo-HTML . Aqui está um artigo de technet sobre o FormatTo-HTML e alguma documentação sobre FormatTo-HTML do ss64.com

Você pode fazer referência a um arquivo css com -cssuri , mas isso é incluído apenas como um link, portanto, não será particularmente útil usar um arquivo local. Em vez disso, você poderia incluir um elemento html <style/> em uma string passada para o sinalizador -head .

FormatTo-HTML tem suas limitações, como não produzir estilos de linha alternados para a coloração, mas pode ser adequado às suas necessidades.

Além disso, você precisa definir a propriedade IsBodyHTML na mensagem. Para fazer isso, você precisa criar um objeto MailMessage em vez de usar System.Net.Mail.SmtpClient::Send para criar um para você. Por exemplo:

$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)
    
por 29.12.2015 / 13:22