将 Powershell 的输出转换为 HTML

将 Powershell 的输出转换为 HTML

我一直在编写一个 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 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"

答案1

您要进行的关键更改是在对象到字符串的转换过程中。现在,您正在使用format-list您想要使用其他转换器的地方,例如 cmdlet FormatTo-HTML。这是一个有关 FormatTo-HTML 的 technet 文章以及一些相关文献来自 ss64.com 的 FormatTo-HTML

您可以使用 引用 css 文件-cssuri,但这仅作为链接包含,因此使用本地文件不是特别有用。相反,您可以<style/>在传递给标志的字符串中包含 html 元素-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)

相关内容