Question

I have a powershell script. In short, the script can collect disk space info from multiple servers and put that in a .htm report that can be sent by mail.

Now, the script does collect the disk info into a report, but i would like it to send an email only if one of the disks has free space lower than the critical value defined in the script.

The script:

# First lets create a text file, where we will later save the freedisk space info 
$freeSpaceFileName = "c:\disk_space.htm" 
$serverlist = "c:\sl.txt" 
$warning = 50 
$critical = 10 
New-Item $freeSpaceFileName -ItemType file -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 "C:\temp\FreeSpace.txt 
# Function to write the HTML Header to the file 
Function writeHtmlHeader 
{ 
param($fileName) 
$date = ( get-date ).ToString('dd.MM.yyyy - HH:mm') 
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 '<title>Disk Report</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: 11px;" 
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  "<table width='100%'>" 
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='4'><strong>Disk Report - $date</strong></font>" 
add-content $fileName  "</td>" 
add-content $fileName  "</tr>" 
add-content $fileName  "</table>" 

} 

# 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 bgcolor='#32B232' align=center>$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>"
 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='#E1E100' align=center>$freePercent</td>"
 Add-Content $fileName "</tr>" 
 } 
} 
Function sendEmail 
{ param($from,$to,$subject,$smtphost,$htmlFileName) 
$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>" 

 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('dd.MM.yyyy') 

#sendEmail cdarwin@evolve.com cdarwin@evolve.com "Disk Space Report - $Date" hub1 $freeSpaceFileName 

I already tried to add some kind of IF, but it didn't work,

Any help is appreciated.

Was it helpful?

Solution

I have added a few lines of code that will check for a threshold, and send an e-mail only if the threshold is exceeded.

$Threshold = 10GB; ########### Add this line
$ThresholdExceeded = $false; ############## Add this line

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>" 

    writeTableHeader $freeSpaceFileName 

    $dp = Get-WmiObject win32_logicaldisk -ComputerName $server |  Where-Object {$_.drivetype -eq 3} 
    foreach ($item in $dp) 
    {
        ################ Add this next line
        if ($Item.FreeSpace -lt $Threshold) { $ThresholdExceeded = $true; };             Write-Host  $item.DeviceID  $item.VolumeName $item.FreeSpace $item.Size 
        writeDiskInfo $freeSpaceFileName $item.DeviceID $item.VolumeName $item.FreeSpace $item.Size 

    } 
}

################### Add this code
if ($ThresholdExceeded) {
    sendEmail cdarwin@evolve.com cdarwin@evolve.com "Disk Space Report - $Date" hub1 $freeSpaceFileName;
}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top