0

I have a script which displays disk space on all servers on a HTML page and side by side sends email from the content of the HTML file saved.

The HTML file is perfect, and the email displays the tabular information same in the HTML file. However, the tables are overlapping in the email....

Code as below:

$freeSpaceFileName = "c:\script\FreeSpace.htm"
$serverlist = "c:\script\computers.txt"
$warning = 50
$critical = 30
New-Item -ItemType file $freeSpaceFileName -Force
# Getting the freespace info using WMI
#Get-WmiObject win32_logicaldisk  | Where-Object {$_.drivetype -eq 3} | format-table DeviceID, VolumeName,status,Size,FreeSpace | Out-File FreeSpace.txt
# Function to write the HTML Header to the file
Function writeHtmlHeader
{
  param($fileName)
  $date = ( get-date ).ToString('dd/MM/yyyy HH:mm:ss')
  Add-Content $fileName "<html>"
  Add-Content $fileName "<head>"
  Add-Content $fileName "<meta http-equiv='Content-Type' content='text/html; charset=iso-8859-1'>"
  Add-Content $fileName '<meta http-equiv="refresh" CONTENT="5">'
  Add-Content $fileName '<title>All Servers DiskSpace Report by Taher Tamboli &copy;</title>'
  add-content $fileName '<STYLE TYPE="text/css">'
  add-content $fileName  "<!--"
  add-content $fileName  "td {"
  add-content $fileName  "font-family: Tahoma;"
  add-content $fileName  "font-size: 20px;"
  add-content $fileName  "border-top: 1px solid #999999;"
  add-content $fileName  "border-right: 1px solid #999999;"
  add-content $fileName  "border-bottom: 1px solid #999999;"
  add-content $fileName  "border-left: 1px solid #999999;"
  add-content $fileName  "padding-top: 0px;"
  add-content $fileName  "padding-right: 0px;"
  add-content $fileName  "padding-bottom: 0px;"
  add-content $fileName  "padding-left: 0px;"
  add-content $fileName  "}"
  add-content $fileName  "body {"
  add-content $fileName  "margin-left: 5px;"
  add-content $fileName  "margin-top: 5px;"
  add-content $fileName  "margin-right: 0px;"
  add-content $fileName  "margin-bottom: 10px;"
  add-content $fileName  ""
  add-content $fileName  "table {"
  add-content $fileName  "border: thin solid #000000;"
  add-content $fileName  "}"
  add-content $fileName  "-->"
  add-content $fileName  "</style>"
  Add-Content $fileName "</head>"
  Add-Content $fileName "<body>"
  add-content $fileName  "<br></br>"
  add-content $fileName  "<table width='100%' align=center>"
  add-content $fileName  "<tr bgcolor='#CCCCCC'>"
  add-content $fileName  "<td colspan='7' height='25' align='center'>"
  add-content $fileName  "<font face='tahoma' color='#003399' size='5'><strong>All Servers DiskSpace Report by Taher Tamboli 2014 &copy; - $date</strong></font>"
  add-content $fileName  "</td>"
  add-content $fileName  "</tr>"
  add-content $fileName  "</table>"
  add-content $fileName  "<br></br>"
}

# Function to write the HTML Header to the file
Function writeTableHeader
{
  param($fileName)

  Add-Content $fileName "<tr bgcolor=#CCCCCC>"
  Add-Content $fileName "<td width='10%' align='center'>Drive</td>"
  Add-Content $fileName "<td width='50%' align='center'>Drive Label</td>"
  Add-Content $fileName "<td width='10%' align='center'>Total Capacity(GB)</td>"
  Add-Content $fileName "<td width='10%' align='center'>Used Capacity(GB)</td>"
  Add-Content $fileName "<td width='10%' align='center'>Free Space(GB)</td>"
  Add-Content $fileName "<td width='10%' align='center'>Freespace %</td>"
  Add-Content $fileName "</tr>"
}

Function writeHtmlFooter
{
  param($fileName)

  Add-Content $fileName "</body>"
  Add-Content $fileName "</html>"
}

Function writeDiskInfo
{
  param($fileName,$devId,$volName,$frSpace,$totSpace)
  $totSpace=[math]::Round(($totSpace/1073741824),2)
  $frSpace=[Math]::Round(($frSpace/1073741824),2)
  $usedSpace = $totSpace - $frspace
  $usedSpace=[Math]::Round($usedSpace,2)
  $freePercent = ($frspace/$totSpace)*100
  $freePercent = [Math]::Round($freePercent,0)
  if ($freePercent -gt $warning)
  {
    Add-Content $fileName "<tr>"
    Add-Content $fileName "<td>$devid</td>"
    Add-Content $fileName "<td>$volName</td>"

    Add-Content $fileName "<td>$totSpace</td>"
    Add-Content $fileName "<td>$usedSpace</td>"
    Add-Content $fileName "<td>$frSpace</td>"
    Add-Content $fileName "<td>$freePercent</td>"
    Add-Content $fileName "</tr>"
  }
  elseif ($freePercent -le $critical)
  {
    Add-Content $fileName "<tr>"
    Add-Content $fileName "<td>$devid</td>"
    Add-Content $fileName "<td>$volName</td>"
    Add-Content $fileName "<td>$totSpace</td>"
    Add-Content $fileName "<td>$usedSpace</td>"
    Add-Content $fileName "<td>$frSpace</td>"
    Add-Content $fileName "<td bgcolor='#FF0000' align=center>$freePercent</td>"
    #<td bgcolor='#FF0000' align=center>
    Add-Content $fileName "</tr>"
  }
  else
  {
    Add-Content $fileName "<tr>"
    Add-Content $fileName "<td>$devid</td>"
    Add-Content $fileName "<td>$volName</td>"
    Add-Content $fileName "<td>$totSpace</td>"
    Add-Content $fileName "<td>$usedSpace</td>"
    Add-Content $fileName "<td>$frSpace</td>"
    Add-Content $fileName "<td bgcolor='#FBB917' align=center>$freePercent</td>"
    # #FBB917
    Add-Content $fileName "</tr>"
  }
}

Function sendEmail
{
  param($from,$to,$subject,$smtphost,$htmlFileName)
  $from=New-Object System.Net.Mail.MailAddress "xxx@cc.com"
  $to= New-Object System.Net.Mail.MailAddress "ccc@...com"
  $subject="Servers Disk space report - $Date"
  $smtphost="smtp.google.com"
  $body = Get-Content $htmlFileName
  $smtp= New-Object System.Net.Mail.SmtpClient $smtphost
  $msg = New-Object System.Net.Mail.MailMessage $from, $to, $subject, $body
  $msg.isBodyhtml = $true
  $smtp.Send($msg)
}

writeHtmlHeader $freeSpaceFileName
foreach ($server in Get-Content $serverlist)
{
  Add-Content $freeSpaceFileName "<table width='100%'><tbody>"
  Add-Content $freeSpaceFileName "<tr bgcolor='#CCCCCC'>"
  Add-Content $freeSpaceFileName "<td width='100%' align='center' colSpan=6><font face='tahoma' color='#003399' size='2'><strong> $server</strong></font></td>"
  Add-Content $freeSpaceFileName "</tr>"
  Add-Content $freeSpaceFileName "<br>"
  writeTableHeader $freeSpaceFileName

  $dp = Get-WmiObject win32_logicaldisk -ComputerName $server |  Where-Object {$_.drivetype -eq 3}
  foreach ($item in $dp)
  {
    Write-Host  $item.DeviceID  $item.VolumeName $item.FreeSpace $item.Size
    writeDiskInfo $freeSpaceFileName $item.DeviceID $item.VolumeName $item.FreeSpace $item.Size
  }
}
writeHtmlFooter $freeSpaceFileName
$date = ( get-date ).ToString('yyyy/MM/dd')
#sendEmail xxx@test.com xxx@test.com "Disk Space Report - $Date" hub1 $freeSpaceFileName

**####** Click HERE for error****###*

0
2

This is happening because you don't close the <table> tag using </table> in your function writeDiskInfo.

To solve this, add the following just before the function close bracket :

Add-Content $fileName "</table>"

So, your function will look like this :

Function writeDiskInfo
{
 ......
 ......
 if ($freePercent -gt $warning)
 {
 .....
 }
 elseif ($freePercent -le $critical)
 {
 .....
 }
 else
 {
 .....
 }
 Add-Content $fileName "</table>"  # <--- ADD THIS HERE !
}

Seems that browsers are more permissive about syntax errors than mail clients ;)

1

What KrisFR has said is correct that you need to add end of table command but he mentioned it wrongly. You need to add in the writeHtmlHeader function just before the end parentheses of the function.

writeHtmlHeader $freeSpaceFileName

foreach ($server in Get-Content $serverlist)

{

...
...

foreach ($item in $dp)

{

...
...

}

Add-Content $fileName " /table>" # <--- ADD THIS HERE !

}

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.