The other day I posted a VBS function for getting drive utilization. It seems only fair to give PowerShell a chance to play.
1: Function Get-Utilization {
2: Param([string]$computername=$env:computername,
3: [string]$ID="C:"
4: )
5:
6: #suppress errors messages
7: $errorActionPreference="silentlycontinue"
8:
9: $drive=Get-WmiObject Win32_Logicaldisk -filter "DeviceID='$ID'" `
10: -computername $computername -errorAction "silentlycontinue"
11:
12: if ($drive.size) {
13:
14: #divide size and freespace by 1MB because they are UInt64
15: #and I can't do anything with them in there native type
16:
17: $size=$drive.size/1MB
18: $free=$drive.freespace/1MB
19:
20: $utilization=($size-$free)/$size
21:
22: write $utilization
23: }
24: else {
25: #there as an error so return a value that can't be mistaken
26: #for drive utilization
27: write -1
28: }
29:
30: }
31:
32: #Sample usage
33: $computer="PUCK"
34: $drive="C:"
35: $u=Get-Utilization $computer $drive
36:
37: #format $u as a percentage to 2 decimal points
38:
39: $percent="{0:P2}" -f $u
40:
41: if ($u -eq -1) {
42: $msg="WARNING: Failed to get drive {0} on {1}" -f $drive,$computer
43: $color="RED"
44: }
45: elseif ($u -ge .75) {
46: $msg="WARNING: Drive {0} on {1} is at {2} utilization." -f $drive,$computer,$percent
47: $color="RED"
48: }
49: else {
50: $msg="WARNING: Drive {0} on {1} is at {2} utilization." -f $drive,$computer,$percent
51: $color="GREEN"
52: }
53:
54: Write-Host $msg -foregroundcolor $color
The Get-Utilization function also uses WMI via the Get-WMIObject cmdlet. One nice advantage to PowerShell is that I can specify default parameter values. I’ve set the defaults to the %computername% environmental variable and drive C:\. To make the function as seamless as possible, I turn off the error pipeline by setting $ErrorActionPreference to SilentlyContinue. I do the same with the -ErrorAction parameter in line 18. If the Get-WMIObject expression is successful, then $drive.size will have a value and I can carry out my utilization calculations. If it doesn’t exist then there was some problem, perhaps permissions or an invalid drive, in this function I don’t really care. Instead I’ll simply return a value that can’t be mistaken for a drive utilization at line 27.
Assuming a valid drive object was returned I perform a similar calculation as I did in VBScript and write the result to the pipeline. Line 33 shows the function in use. I use an If ElseIf construct to display an appropriate message depending on the value returned by Get-Utilization. Another advantage over VBScript is that I can display the message in a different color depending on the utilization value.
You’re welcome to expand the function. For example, there is no provision for alternate credentials. You could probably add more error handling. I have to leave some fun for you right?
Download the PowerShell file here.