The Get-DiskSpace cmdlet from the NTFSsecurity module is useful in that it gives ready calculated percentages of free and used space:

AvailableFreeSpacePercent : 56.73%

AvailableFreeSpaceUnitSize : 270.11 GB

ClusterSize : 4096

DriveName : \\?\Volume{c1c4c5bb-0000-0000-0000-f01500000000}\

TotalSizeUnitSize : 476.1 GB

UsedSpacePercent : 43.27%

UsedSpaceUnitSize : 206 GB

FreeBytesAvailable : 290024239104

TotalNumberOfBytes : 511210610688

TotalNumberOfFreeBytes : 290024239104

BytesPerSector : 512

NumberOfFreeClusters : 70806699

SectorsPerCluster : 8

TotalNumberOfClusters : 124807278

BUT as you can see it doesn’t identify the Drive Name by user friendly name.

You can do

PS> Get-DiskSpace -DriveLetter C:

AvailableFreeSpacePercent : 56.73%

AvailableFreeSpaceUnitSize : 270.1 GB

ClusterSize : 4096

DriveName : C:\

TotalSizeUnitSize : 476.1 GB

UsedSpacePercent : 43.27%

UsedSpaceUnitSize : 206 GB

FreeBytesAvailable : 290020270080

TotalNumberOfBytes : 511210610688

TotalNumberOfFreeBytes : 290020270080

BytesPerSector : 512

NumberOfFreeClusters : 70805730

SectorsPerCluster : 8

TotalNumberOfClusters : 124807278

but that means passing each drive separately. The DriveLetter parameter should take an array of drives according to the syntax diagram but that doesn’t seem to work.

Try running something like

Get-Volume |

where DriveLetter |

sort Driveletter |

foreach {

Get-DiskSpace -DriveLetter “$($_.Driveletter):” |

select DriveName, TotalSizeUnitSize, UsedSpaceUnitSize,

AvailableFreeSpaceUnitSize, UsedSpacePercent, AvailableFreeSpacePercent

}

and you get a nice output

DriveName : C:\

TotalSizeUnitSize : 476.1 GB

UsedSpaceUnitSize : 206 GB

AvailableFreeSpaceUnitSize : 270.1 GB

UsedSpacePercent : 43.27%

AvailableFreeSpacePercent : 56.73%