(Taken from an old answer of mine over at Server Fault)
The easiest way to reliably get at the free disk space is using WMI. When trying to parse the output of dir
you get all kinds of funny problems, at the very least with versions of Windows in other languages. You can use wmic
to query the free space on a drive:
wmic logicaldisk where "DeviceID='C:'" get FreeSpace
This will output something like
FreeSpace
197890965504
You can force this into a single line by adding the /format:value
switch:
> wmic logicaldisk where "DeviceID='C:'" get FreeSpace /format:value
FreeSpace=197890965504
There are a few empty lines there, though (around three or four) which don't lend themselves well for processing. Luckily the for
command can remove them for us when we do tokenizing:
for /f "usebackq delims== tokens=2" %x in (`wmic logicaldisk where "DeviceID='C:'" get FreeSpace /format:value`) do set FreeSpace=%x
The nice thing here is that since we're only using the second token all empty lines (that don't have a second token) get ignored.
Remember to double the %
signs when using this in a batch file:
for /f "usebackq delims== tokens=2" %%x in (`wmic logicaldisk where "DeviceID='C:'" get FreeSpace /format:value`) do set FreeSpace=%%x
You can now use the free space which is stored in the environment variable %FreeSpace%
.
Getting percentages now is a little tricky since batch files only support 32-bit integers for calculation. However, you probably don't need to calculate this to the byte; I think megabytes are quite enough:
for /f "usebackq delims== tokens=2" %%x in (`wmic logicaldisk where "DeviceID='C:'" get FreeSpace /format:value`) do set FreeSpace=%%x
for /f "usebackq delims== tokens=2" %%x in (`wmic logicaldisk where "DeviceID='C:'" get Size /format:value`) do set Size=%%x
set FreeMB=%FreeSpace:~0,-6%
set SizeMB=%Size:~0,-6%
set /a Percentage=100 * FreeMB / SizeMB
echo C: is %Percentage% % free
This should work unless your volumes get larger than 20 TiB.