Windows PowerShell:PowerShell 中的 HTML 报告

事实上,您可以使用 Microsoft Windows PowerShell Cmdlet 来生成 HTML 报告,并与同事共享。

Don Jones

在 Windows PowerShell 的众多功能中,其内置功能可以从它的各种 Cmdlet 中生成 HTML 输出。简单地将 Cmdlet 输出传输到 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

您将得到一个服务列表,其中包含本应运行但并未运行的服务。这就是您可能要写入 Intranet 文件服务器,并让支持人员每天早晨检查的内容。此外,当您输入所有这些内容时,前四行应以管道字符 (|) 结尾。最后一行以回车符结尾。

如果您以交互方式将其输入到 Shell 中,请注意在完成第一行输入并回车后,提示符将变为“>>”。没问题。这意味着 Windows PowerShell 已经准备好让您输入下一行。在输入第四行和最后一行之后,请按两次 Enter 键来告知 Shell 您已经完成输入,并希望其执行该命令。

有关 ConvertTo-HTML Cmdlet 的一个问题是:根据其设计,它每次只能处理一种类型的输出。如果您尝试向它提供多种对象类型 - 服务、流程或事件日志项 - 它就不能正确地格式化输出。

如果您想创建某种合并报告,诀窍就是使用 Cmdlet 的不同参数。例如,假设您想要生成一份包含前面提到的“应该运行但并未运行的服务”的报告,您还希望该页列出最近 100 个安全事件日志项、服务器正在运行的所有进程以及有关服务器本身的一些基本信息。

您需要知道两件事:首先是 ConvertTo-HTML 的 -Fragment 参数(可以在其帮助文件中找到),其次是 Cmdlet 并没有将 HTML 写入文件的事实。

就像在第一个示例中,Cmdlet 将 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

在输入这些内容时,每行都应该以管道符号结尾,但最后一行应该以回车符结尾。 这会运行四个截然不同的命令,每个命令将检索信息的一个特定片段,并将其转换为 HTML 片段。

HTML 片段是一个 HTML 长字符串,它不含可以构成完整页面的标头标记。在最后一个步骤中,我简单地将 HTML 并入一个完整页面的正文中,并将其输出至一个文件中。

尝试运行它,看看您的想法会是什么样子。它非常简单。有一个笑话说,Windows PowerShell 是唯一能够输出“干净”的、不添加任何样式和格式的 HTML 的 Microsoft 产品。弊端就是“干净”的 HTML 非常乏味。这正是目的。您应该使用一个单独的 CSS 文件使其变得更吸引人。

在 HTML 中,您首先要对 HTML <td> 标记应用格式。这些标记包含表格的各个行。<th> 标记包含表格的列标题。<body> 标记为整个页面提供默认格式。创建一个名为 C:\Style.css 的文本文件并输入以下内容:

body {
font-family:Calibri;
 font-size:10pt;
}
th { 
background-color:black;
color:white;
}
td {
 background-color:#666;
color:black;
}
Now, I’ll simply modify my lastConvertTo-HTML command as follows:
ConvertTo-HTML -Body "$one $two $three $four" -Title "Server Status" -CssUri c:\style.css |
 Out-File c:\status.html

应输入两行文本,第一行同样要以管道符号结尾。尝试运行全部:您将发现一个格式更好的输出。遗憾的是,CSS 没有提供应用交替表格行风格的方式,至少没有适合 Windows PowerShell 生成 HTML 输出的方式。

您可以使用 ConvertTo-HTML 的 -PreContent 参数和 -PostContent 参数来添加节标题和其他任何文本。这有助于使报告变得更容易阅读。它将在表格之前显示任何传递给 -PreContent 的字符串。传递给 -PostContent 的文本将显示在表格之后。您可以通过在 Shell 中运行 Help ConvertTo-HTML
-example 来找到有关这些操作的示例。

这是一个关于如何使用 Microsoft Windows PowerShell 来生成帮助性报告,并与同事共享的极好示例。创建样式适当的 HTML 输出并不需要大量的额外工作。将这些页面保存到 Intranet 文件服务器上,您的同事、经理和那些可能需要的人就能访问这些页面。

Don Jones

Don Jones 是 Microsoft MVP 奖获得者,也是《Learn Windows PowerShell in a Month of Lunches》(Manning Publications Co.,2010)一书的作者,这本书可以帮助所有管理员高效地使用 Windows PowerShell。此外,Jones 还提供公开和现场 Windows PowerShell 培训。您可以通过他的网站 ConcentratedTech.com 与他联系。

相关内容