The purpose of this script is to monitor disk space on a list of servers. Right now, it uses a hard-coded 20% as the point at which to send the email (look for variable $thresholdspace in the code below). An enhancement could be to have different percents on each server. The script reads a file that has a list of servers to be monitored; it will check each disk on each of those servers.
BizTalk and other server level products can come to a screeching halt if there is not enough disk space on the servers.
######################################################### # # Disk space monitoring and reporting script # Neal Walters - 06/18/2013 - found original code on web # then customized # ######################################################### [string[]] $users = "test@abc.com","test2@abc.com","admin@xyz.com" # List of users to email your report to (separate by comma) or use a distribution list $fromemail = "FromEmail@abc.com" $server = "your.emailRelayServer.com" #enter your own SMTP or Relay server DNS name / IP address here $list = $args[0] #This accepts the argument you add to your scheduled task for the list of servers. i.e. list.txt $computers = get-content $list #grab the names of the servers/computers to check from the list.txt file. # Set free disk space threshold below in percent (default at 10%) [decimal]$thresholdspace = 20 #assemble together all of the free disk space data from the list of servers and only include it if the percentage free is below the threshold we set above. $tableFragment= Get-WMIObject -ComputerName $computers Win32_LogicalDisk ` | select __SERVER, DriveType, VolumeName, Name, @{n='Size (Gb)' ;e={"{0:n2}" -f ($_.size/1gb)}},@{n='FreeSpace (Gb)';e={"{0:n2}" -f ($_.freespace/1gb)}}, @{n='PercentFree';e={"{0:n2}" -f ($_.freespace/$_.size*100)}} ` | Where-Object {$_.DriveType -eq 3 -and [decimal]$_.PercentFree -lt [decimal]$thresholdspace} ` | ConvertTo-HTML -fragment # assemble the HTML for our body of the email report. $HTMLmessage = @" <font color=""black"" face=""Arial, Verdana"" size=""3""> <u><b>Disk Space Storage Report</b></u> <br>This report was generated because the drive(s) listed below have less than $thresholdspace % free space. Drives above this threshold will not be listed. <br> <style type=""text/css"">body{font: .8em ""Lucida Grande"", Tahoma, Arial, Helvetica, sans-serif;} ol{margin:0;padding: 0 1.5em;} table{color:#FFF;background:#C00;border-collapse:collapse;width:647px;border:5px solid #900;} thead{} thead th{padding:1em 1em .5em;border-bottom:1px dotted #FFF;font-size:120%;text-align:left;} thead tr{} td{padding:.5em 1em;} tfoot{} tfoot td{padding-bottom:1.5em;} tfoot tr{} #middle{background-color:#900;} </style> <body BGCOLOR=""white""> $tableFragment </body> "@ # Set up a regex search and match to look for any <td> tags in our body. These would only be present if the script above found disks below the threshold of free space. # We use this regex matching method to determine whether or not we should send the email and report. $regexsubject = $HTMLmessage $regex = [regex] '(?im)<td>' # if there was any row at all, send the email if ($regex.IsMatch($regexsubject)) { send-mailmessage -from $fromemail -to $users -subject "Disk Space Monitoring Report" -BodyAsHTML -body $HTMLmessage -priority High -smtpServer $server Write-Host "Email sent" } # End of Script
Then create a wrapper .bat or .cmd file like this:
powershell -command "& 'I:\Scripts\DiskMonitor.ps1'" DiskMonitorComputerList.txt
Then you create a file called DiskMonitorComputerList.txt that contains a list of servers:
ServerName1 ServerName2 MachineName3