MCPMag.com

Sign up for our newsletter.

I agree to this site's Privacy Policy.

Prof. Powershell

HTML Bits and Pieces, Part 3

Now that you're able to create HTML reports, how about doing something with it? Here's how to send it as an e-mail with the Send-MailMessage cmdlet.

In the last few lessons we've been exploring ways of creating HTML reports in PowerShell using ConvertTo-HTML. This time, lets' look at some other fun we can have with HTML and PowerShell. First, let's send an HTML document as an e-mail.

The Send-MailMessage cmdlet includes a switch parameter that indicates the body is HTML code. This makes it very easy to distribute HTML based reports. Even better, you don't even need a complete HTML document. You should be able to get by with fragments, although if you want to use a style sheet you need to embed it in the HTML fragment. For example, I'll start by defining my style tag which will be part of the message body:

$body=@"
<style type='text/css'>
{
font-family:Tahoma, Arial, Helvetica, sans-serif;
font-smoothing:always;
width:100%;
border-collapse:collapse;
}
td
{
font-size:12pt;
border:1px #0000FF solid;
padding:5px 5px 5px 5px;
}
th
{
font-size:14pt;
text-align:left;
padding-top:5px;
padding-bottom:4px;
background-color:#0000FF;
color:#FFFFFF;
}
name tr
{
color:#000000;
background-color:#0000FF;
}
</style>
"@

Next, I'll add some data to it:

$body += get-process | where { $_.WS -ge 10MB} | Select ID,Name,WS,Path | ConvertTo-Html -Fragment -As List -PreContent "<h3>Process Workingset Size >= 10MB</h3>"

I'm creating a list fragment and also inserting a header caption before my data. All that remains is to e-mail the fragment to myself:

Send-MailMessage -to jhicks@jdhitsolutions.com -from jhicks@jdhitsolutions.com -subject "Top Processes" -body ($body | out-string) -BodyAsHtml -SmtpServer mail.jdhitsolutions.com -Credential jhicks@jdhitsolutions.com

There is one little trick here and that is to make sure the body is a string and not an array of string. That's why I pipe $body to Out-String. The end result is that in my inbox I get a formatted HTML report (see Fig. 1).

Sample HTML report as it might look in one's e-mail.

Figure 1. Sample HTML report as it might look in one's e-mail. (Click image to view larger version.)

Or perhaps your document could use a little navigation. Here's a simple example. First I'll define a string that includes the navigation links:

$nav = @"
<a href='#ComputerSystem'>ComputerSystem</a>
<a href='#OperatingSystem'>OperatingSystem</a>
<a href='#Drives'>Drives</a>
<a href='#' target='_top'>Top</a>
"@

To use them I also need to define an anchor name for each section:

$data=""
$data += Get-WmiObject win32_Computersystem | Select Manufacturer,Model,TotalPhysicalMemory | ConvertTo-Html -PreContent "<h2><a name='ComputerSystem'>ComputerSystem</a></h2>" -post $nav -Fragment

This command gets data from WMI and creates an HTML fragment. Before the data I'm displaying a heading that includes defining the anchor name and after the fragment are my navigation links. I'll repeat this for the other data in my report with a break between tables:

$data+="<br>"
$data += Get-WmiObject win32_OperatingSystem | Select Caption,*Memory,
@{Name="Installed";Expression={$_.ConvertToDateTime($_.InstallDate)}},
@{Name="LastBoot";Expression={$_.ConvertToDateTime($_.LastBootUpTime)}} |
ConvertTo-Html -PreContent "<h2><a name='OperatingSystem'>OperatingSystem</a></h2>" -post $nav -Fragment

$data+="<br>"
$data += Get-WmiObject Win32_logicaldisk -filter "DriveType=3" |
Select DeviceID,@{Name="SizeMB";Expression={($_.Size/1MB) -as [int]}},
@{Name="FreeMB";Expression={[math]::Round(($_.Freespace/1MB),2)}} |
ConvertTo-Html -PreContent "<h2><a name='Drives'>Drives</a></h2>" -post $nav -Fragment

At this point, all that remains is to assemble the final document and save it to a file:

ConvertTo-Html -InputObject $null -Title "System Report" -PreContent "<H1>System Report</H1>" -PostContent $data -css \\jdh-nvnas\files\blue.css | Out-File c:\work\sysreport.htm

Same HTML report, now with navigation.

Figure 2. Same HTML report, now with navigation. (Click image to view larger version.)

There's really no limit to what you can accomplish. If you would like to experiment with this further, you can download a zip file with my sample CSS file and PowerShell code that I used to generate this report.

About the Author

Jeffery Hicks is a multi-year Microsoft MVP in Windows PowerShell, Microsoft Certified Professional and an IT veteran with almost 25 years of experience, much of it spent as an IT infrastructure consultant specializing in Microsoft server technologies with an emphasis in automation and efficiency. He works today as an independent author, trainer and consultant. Jeff is a regular contributor to a variety on online sites, as well as frequent speaker at technology conferences and user groups. Keep up with Jeff and his projects at http://jdhitsolutions.com/blog.

comments powered by Disqus