Forum Discussion
Fgarpol
Apr 03, 2020Copper Contributor
script to check free space on drives has a fixed value
Hi there, I have a script that checks on my environment if any of the drives on any server is below 10GB of free space, and then fires and email accordingly. the problem i am facing is that some...
Erick A. Moreno R.
Apr 04, 2020Iron Contributor
Hello , Fgarpol .
My first option would be to ignore those drives with less than the Min Size. In the same way, you can add other filters and options depending on what you want to do with them.
param(
[Parameter(Mandatory=$false,ValueFromPipelineByPropertyName=$false)]
[string] $minSize = 10GB,
[Parameter(Mandatory=$false,ValueFromPipelineByPropertyName=$false)]
[string] $hosts = $null,
[Parameter(Mandatory=$false,ValueFromPipelineByPropertyName=$false)]
$volumes = $null,
# - email_to : if specified, will send a low-disk-space warning email to the given colon-separated addresses.
# Example: $email_to = "my@email.com:your@email.com";
# Default is $null (no e-mail will be sent). Replace it with your@email.com if you don't want to set it from the CLI.
[Parameter(Mandatory=$false,ValueFromPipelineByPropertyName=$false)]
[string] $email_to = "support@mycompany.com",
[Parameter(Mandatory=$false,ValueFromPipelineByPropertyName=$false)]
$email_username = "administrador@mycompany.com",
[Parameter(Mandatory=$false,ValueFromPipelineByPropertyName=$false)]
$email_password = "#########",
[Parameter(Mandatory=$false,ValueFromPipelineByPropertyName=$false)]
$email_smtp_host = "smtp.office365.com",
[Parameter(Mandatory=$false,ValueFromPipelineByPropertyName=$false)]
$email_smtp_port = 587,
[Parameter(Mandatory=$false,ValueFromPipelineByPropertyName=$false)]
$email_smtp_SSL = 1,
[Parameter(Mandatory=$false,ValueFromPipelineByPropertyName=$false)]
$email_from = "Monitor Admin <administrador@mycompany.com>"
)
$sep = ":";
$hosts = Get-Content -Path c:\scripts\computers.txt
# if there are no $cur_hosts set, set the local computer as host.
if (!$hosts) { $hosts = $env:computername; }
foreach ($cur_host in $hosts.split($sep))
{
# converts IP to hostNames
if (($cur_host -As [IPAddress]) -As [Bool]) {
$cur_host = [System.Net.Dns]::GetHostEntry($cur_host).HostName
}
Write-Host ("");
Write-Host ("");
Write-Host ("----------------------------------------------");
Write-Host ($cur_host);
Write-Host ("----------------------------------------------");
$drives_to_check = @();
if ($null -eq $volumes) {
$volArr =
If ($cur_host -eq $env:computername) { Get-WMIObject win32_volume }
Else { Invoke-Command -ComputerName $cur_host -ScriptBlock { Get-WMIObject win32_volume } }
$drives_to_check = @();
foreach ($vol in $volArr | Sort-Object -Property DriveLetter) {
if ($vol.DriveType -eq 3 -And $null -ne $vol.DriveLetter ) {
$drives_to_check += $vol.DriveLetter[0];
}
}
}
Else { $drives_to_check = $volumes.split($sep) }
foreach ($d in $drives_to_check) {
# Write-Host ("");
# Write-Host (" Checking drive " + $d + " ...");
$disk = If ($cur_host -eq $env:computername) { Get-PSDrive $d }
Else { Invoke-Command -ComputerName $cur_host -ScriptBlock { Get-PSDrive $using:d } }
if ($disk.Free -lt $minSize -and $($disk.Free + $Disk.Used) -gt $minSize) {
Write-Host " - [" -noNewLine
Write-Host "KO" -noNewLine -ForegroundColor Red
Write-Host "] " -noNewLine
Write-Host ("Drive " + $d + " has less than " + ($minSize/1GB).ToString(".00") `
+ " GB free (" + ($disk.Free/1GB).ToString(".00") + " GB)") -noNewLine
if ($email_to) {
Write-Host(": sending e-mail...");
$message = new-object Net.Mail.MailMessage;
$message.From = $email_from;
foreach ($to in $email_to.split($sep)) {
$message.To.Add($to);
}
$message.Subject = ("Alert: " + $cur_host + " drive " + $d);
$message.Subject += (" has less than " + ($minSize/1GB).ToString(".00") + " GB free ");
$message.Subject += (" (" + ($disk.Free/1GB).ToString(".00") +" GB)");
$message.Body = "Hello, `r`n`r`n";
$message.Body += "this is an automatic e-mail message ";
$message.Body += "sent by the Monitor Admin ";
$message.Body += ("to inform you that " + $env:computername + " drive " + $d + " ");
$message.Body += "is running low on free space. `r`n`r`n";
$message.Body += "--------------------------------------------------------------";
$message.Body += "`r`n";
$message.Body += ("Machine HostName: " + $env:computername + " `r`n");
$message.Body += "Machine IP Address(es): ";
$ipAddresses = Get-NetIPAddress -AddressFamily IPv4;
foreach ($ip in $ipAddresses) {
if ($ip.IPAddress -like "127.0.0.1") {
continue;
}
$message.Body += ($ip.IPAddress + " ");
}
$message.Body += "`r`n";
$message.Body += ("Used space on drive " + $d + ": " + ($disk.Used/1GB).ToString(".00") +" GB. `r`n");
$message.Body += ("Free space on drive " + $d + ": " + ($disk.Free/1GB).ToString(".00") +" GB. `r`n");
$message.Body += "--------------------------------------------------------------";
$message.Body += "`r`n`r`n";
$message.Body += "This warning will fire when the free space is lower ";
$message.Body += ("than " + ($minSize/1GB).ToString(".00") + " GB `r`n`r`n");
$message.Body += "Sincerely, `r`n`r`n";
$message.Body += "-- `r`n";
$message.Body += "Monitor Admin`r`n";
$smtp = new-object Net.Mail.SmtpClient($email_smtp_host, $email_smtp_port);
$smtp.EnableSSL = $email_smtp_SSL;
$smtp.Credentials = New-Object System.Net.NetworkCredential($email_username, $email_password);
$smtp.send($message);
$message.Dispose();
Write-Host " E-Mail sent!" ;
}
Else {
Write-Host(".");
}
}
ElseIf($($disk.Free + $Disk.Used) -lt $minSize)
{
Write-Host " - [" -noNewLine
Write-Host "Warning" -noNewLine -ForegroundColor Yellow
Write-Host "] " -noNewLine
Write-Host ("Drive " + $d + " has less than " + ($minSize/1GB).ToString(".00") + " bytes Total Space: nothing to do.")
}
Else {
Write-Host " - [" -noNewLine
Write-Host "OK" -noNewLine -ForegroundColor Green
Write-Host "] " -noNewLine
Write-Host ("Drive " + $d + " has more than " + ($minSize/1GB).ToString(".00") + " bytes free: nothing to do.")
}
}
}