Powershell DiskMonitor Script

Hi there

I have a script that i found on the web (cant remember where).  Ive used it and it does exactly what i want which is report back on disks that are belwo a specified %.

However Ive noticed that there are around a handfull of servers that it doesnt report on.  The servers exist, can be pinged and the wmi-object commands work.

THe report emails out, so if if these servers are in a lkist with others the email still comes out just with those servers missing.  If i run the script with only the servers that dont work then theres no email or any errors?

$users = "Email Address" # List of users to email your report to (separate by comma)
$fromemail = "Email Address"
$server = "SMTP Server" #enter your own SMTP 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 = 5

#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.
<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 th{padding:1em 1em .5em;border-bottom:1px dotted #FFF;font-size:120%;text-align:left;}
thead tr{}
td{padding:.5em 1em;}
tfoot td{padding-bottom:1.5em;}
tfoot tr{}
<body BGCOLOR=""white"">

# 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

Open in new window

Who is Participating?
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

Miguel Angel Perez MuñozCommented:
Could you check execution policy on servers where work and where not work?

Do a get-executionpolicy and set same on servers where script is failing. Additionally, can search on powershell event viewer what is happening.
Colchester_InstituteAuthor Commented:
The policys are set as unrestricted on all servers......also no errors within event viewer?
Rajitha ChimmaniCommented:
Try to run just these commands (one by one not as a script) just on those servers and see if you get any results. There is some condition to filter the results based on free space threshold. Possible that those servers dont have any drives which satisfy the condition

$computers = get-content $list #grab the names of the servers/computers to check from the list.txt file.
[decimal]$thresholdspace = 5
$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)}}

$tablefragment #print the output from above command

Then, try the following command to see if you get any results

$tablefragment | Where-Object {$_.DriveType -eq 3 -and [decimal]$_.PercentFree -lt [decimal]$thresholdspace}

Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trial
Has Powershell sent you back into the Stone Age?

If managing Active Directory using Windows Powershell® is making you feel like you stepped back in time, you are not alone.  For nearly 20 years, AD admins around the world have used one tool for day-to-day AD management: Hyena. Discover why.

Colchester_InstituteAuthor Commented:
I know the drives meet the condition set as its regarding space being less than 5% and they have drives that have space that is less than 5%

Im a bit confused on how to run

"$computers = get-content $list #grab the names of the servers/computers to check from the list.txt file.
 [decimal]$thresholdspace = 5
 $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)}}"

as no txt file specified?
Rajitha ChimmaniCommented:
Ohh..yeah..my bad

$computers = get-content <path to txt file>
Colchester_InstituteAuthor Commented:
ok so if i run

$computers = get-content $list #grab the names of the servers/computers to check from the list.txt file.
  [decimal]$thresholdspace = 5
  $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)}}

nothing appears.

I then run


and the server in the list appears

i then run

$tablefragment | Where-Object {$_.DriveType -eq 3 -and [decimal]$_.PercentFree -lt [decimal]$thresholdspace}

and get nothing
Colchester_InstituteAuthor Commented:
i think its the drive type....is there a way i can tell this to search for 1,2,3,4,5?
Joshua GrantomSenior Systems AdministratorCommented:
you should be able to inclose the range in a bracket to use a regular expression like so.

$tablefragment | Where-Object {$_.DriveType -eq [1-5] -and [decimal]$_.PercentFree -lt [decimal]$thresholdspace}
Colchester_InstituteAuthor Commented:
Its ok the info i was given was wrong and the script is working, but thank you fo showing me how to break it down and test it.
It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today

From novice to tech pro — start learning today.