I have been tasked with writting a script to analyze our servers on a daily basis. I found this most excellent server inventory script that pulls virtually every conceivable value from a server.
Now, on our Exchange cluster, we've used Volume Mount Points for the resources. This means that a 9gb drive with eight 330gb folders (or mount points) to SAN storage. If I simply pull the drive freespace, I get ~6gb (local hard drive), even though the mount points each show over 100gb free.
So.. this script. It queries the server ($ServerName) and looks up all the mount points, then queries the volumes and returns the current size, free space, and % free for each labeled mount point.
Note (Nov 10, 2008): I cleaned up a warning in the script that popped up a false error when the folder was empty. In addition, I realized the data is more useful to me in a record format, so I have the data returned in an array instead of simple string (CSV) format. Powershell displays the data for one server like this:
| Name | FileSize | FreeSpace | PercFree |
|---|---|---|---|
| I:\SG1\ | 229641617408 | 128873562112 | 36 % |
| I:\Utility\ | 0 | 347809751040 | 100 % |
| I:\SMTPMTA\ | 0 | 53606744064 | 100 % |
#Get-MountPointInfo.PS1 Script
#Eric Woodford
#Scripts@ericwoodford.com
#Nov 11, 2008
#Discover and detail volume mount points on a specified Windows server.
#
function Get-MountPointInfo($ServerName) {
$Summary = @()
$objFSO = New-Object -com Scripting.FileSystemObject
$MountPoints = gwmi -class "win32_mountpoint" -namespace "root\cimv2" -computername $ServerName
$Volumes = gwmi -class "win32_volume" -namespace "root/cimv2" -ComputerName $ServerName| select name, freespace
foreach ($MP in $Mountpoints) {
$MP.directory = $MP.directory.replace("\\","\")
foreach ($v in $Volumes) {
$vshort = $v.name.Substring(0,$v.name.length-1 )
$vshort = """$vshort""" #Make it look like format in $MP (line 11).
if ($mp.directory.contains($vshort)) { #only queries mountpoints that exist as drive volumes no system
$Record = new-Object -typename System.Object
$DestFolder = "\\"+$ServerName + "\"+ $v.name.Substring(0,$v.name.length-1 ).Replace(":","$")
#$destFolder #troubleshooting string to verify building dest folder correctly.
$colItems = (Get-ChildItem $destfolder | where{$_.length -ne $null} |Measure-Object -property length -sum)
#to clean up errors when folder contains no files.
#does not take into account subfolders.
if($colItems.sum -eq $null) {
$fsize = 0
} else {
$fsize = $colItems.sum
}
$TotFolderSize = $fsize + $v.freespace
$percFree = "{0:P0}" -f ( $v.freespace/$TotFolderSize)
$Record | add-Member -memberType noteProperty -name Name -Value $V.name
$Record | add-Member -memberType noteProperty -name FileSize -Value $fsize
$Record | add-Member -memberType noteProperty -name FreeSpace -Value $v.freespace
$Record | add-Member -memberType noteProperty -name PercFree -Value $percFree
$Summary += $Record
}
}
}
return $Summary
}
$ServerName = "YourServerNameHere"
Get-MountPointInfo($ServerName) | convertto-html -title $ServerName > c:\Report-DriveSpace_for_$ServerName.html
Comments
show in GB
Can this modified to show the results in GB format?
Hi great little script, can
Hi great little script, can you get it to do all drives, instead of stripping put the non mounted filesystems?
Thanks
As for non-mounted file system drives
I'd think that you'd want to use something like the WMI query for Volumes.
$Volumes = gwmi -class "win32_volume" -namespace "root/cimv2" -ComputerName $ServerName| select name, freespace
This on my PC is returning:
name freespace
---- ---------
C:\ 52187070464
D:\ 40777900032
Multiple computers
any way to get this to query many servers at once?
Post new comment