How Can I Determine the Percentage of Free Space on a Drive?

How Can I Determine the Percentage of Free Space on a Drive?

  • Comments 5
  • Likes
Hey, Scripting Guy! Question

Hey, Scripting Guy! I know how to determine the amount of free space on a drive, but how can I determine the percentage of free disk space on a drive?

-- MS

SpacerHey, Scripting Guy! AnswerScript Center

Hey, JP. You’re right: determining the amount of free disk space on a drive is pretty easy. For example, this simple little script tells you the amount of free space (in bytes) for drive C on a computer:

strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colDisks = objWMIService.ExecQuery _
    ("Select * from Win32_LogicalDisk Where DeviceID = 'C:'")
For Each objDisk in colDisks
    Wscript.Echo objDisk.FreeSpace
Next

And we have good news for you: determining the percentage of free disk space is almost as easy. That’s because the percentage of free disk space requires just a simple calculation: you take the available disk space and divide it by the total size of the drive. Suppose we had a really small drive, a 10-byte drive with 2 bytes of free disk space. To determine the percentage of free disk space, we’d divide 2 by 10 (free space by total size) and get a value of .20. In other words, 20% free space on our teeny-tiny drive.

It’s a simple equation, and we already have half of it: the FreeSpace property of the Win32_LogicalDisk class tells us the amount of free space. And although you might not have realized it, we also have the second half of the equation: the Size property of that same class tells us the size of the drive. All we need to do in our script is divide the FreeSpace by the Size, and we have our percentage:

strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colDisks = objWMIService.ExecQuery _
    ("Select * from Win32_LogicalDisk Where DeviceID = 'C:'")
For Each objDisk in colDisks
    intFreeSpace = objDisk.FreeSpace
    intTotalSpace = objDisk.Size
    pctFreeSpace = intFreeSpace / intTotalSpace
    Wscript.Echo pctFreeSpace 
Next

Nifty, huh? The only problem with this script is that it reports back a decimal number like 0.22457268101427. Technically accurate, yes, but an answer that doesn’t really look much like a percentage. So let’s use VBScript’s FormatPercent function to get back a value like 22.45%:

strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colDisks = objWMIService.ExecQuery _
    ("Select * from Win32_LogicalDisk Where DeviceID = 'C:'")
For Each objDisk in colDisks
    intFreeSpace = objDisk.FreeSpace
    intTotalSpace = objDisk.Size
    pctFreeSpace = intFreeSpace / intTotalSpace
    Wscript.Echo FormatPercent(pctFreeSpace)
Next

That’s much better.

Just for the heck of it, here’s another variation. By default, the Win32_LogicalDisk class looks at all disk drives on your computer, including floppy drives, removable Zip drives, etc. If you’d like to get back free space information on just your hard drives, modify your WQL Query so that it selects all drives with a DriveType of 3 (which, in the world of WMI, represents a hard drive). In other words:

strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colDisks = objWMIService.ExecQuery _
    ("Select * from Win32_LogicalDisk Where DriveType = 3")
For Each objDisk in colDisks
    intFreeSpace = objDisk.FreeSpace
    intTotalSpace = objDisk.Size
    pctFreeSpace = intFreeSpace / intTotalSpace
    Wscript.Echo objDisk.DeviceID, FormatPercent(pctFreeSpace)
Next

Your comment has been posted.   Close
Thank you, your comment requires moderation so it may take a while to appear.   Close
Leave a Comment
  • Thanks this is great!

  • Hi, Thats a nice script, can the output be converted to a HTML format and used for some mailing?

  • Hi, this is great! Is there a way to deposit this info on a file or on a list of sharepoint?

    Thanks in advance

  • Awesome...love the simplicity.  Can you set your query to only include the system partition (which of course isn't always C:)??

  • John -

    sysdrive = shell.Environment("PROCESS")("SYSTEMDRIVE")