views:

197

answers:

2

Is it possible to programatically find the free space available in mapped drives?

How to find the percentage of free space in your drive using ms-dos.
It may be easy to find the free space for a drive in ur hard disc but i need to find the free-space of mapped drives.

I have mapped some file servers in my systems.

It is possible to see this in My Computer, but how do show it in a command prompt?

+1  A: 

(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.

Joey
gr8 thank u ..actually the answer is 7.79 it displays as 7 can it be displayed in float ?
Arunachalam
@aru: Not as such, no. cmd only supports integer calculations. You can multiply by 10000 instead of 100 and insert a decimal point manually, though. However, then the free size may not exceed 200 GiB.
Joey
A: 

You need GetDiskFreeSpaceEx. Works with drives, mapped drives, etc.

ULARGE_INTEGER free;
ULARGE_INTEGER total;
ULARGE_INTEGER totalFree;
BOOL           ok;

ok = GetDiskSpaceFreeEx(path, &free, &total, &totalFree);
if (ok)
{
// do your sums here, then printf the result
}
Stephen Kellett
Command line, scripting ... I doubt that means C.
Joey