# encoding: ascii
# api: powershell
# title: Get-MountPointData
# description: Get information about free/used space on Windows server mount points (regular drives are also supported) using Get-MountPointData — click that link for more information.
# version: 0.1
# type: function
# author: Joakim Svendsen
# license: CC0
# function: Get-DeviceIDFromMP
# x-poshcode-id: 3717
# x-archived: 2013-07-21T00:49:28
# x-published: 2013-10-27T11:29:00
#
#
# Convert from one device ID format to another.
function Get-DeviceIDFromMP {
param([Parameter(Mandatory=$true)][string] $VolumeString,
[Parameter(Mandatory=$true)][string] $Directory)
if ($VolumeString -imatch '^\s*Win32_Volume\.DeviceID="([^"]+)"\s*$') {
# Return it in the wanted format.
$Matches[1] -replace '\\{2}', '\'
}
else {
# Return a presumably unique hashtable key if there's no match.
"Unknown device ID for " + $Directory
}
}
function Get-MountPointData {
param([Parameter(Mandatory=$true)][string[]] $ComputerName,
#[switch] $DoNotExcludeDefaults,
[switch] $IncludeRootDrives
)
foreach ($Computer in $ComputerName) {
try {
# Collect mount point device IDs and populate a hashtable with IDs as keys
$MountPointData = @{}
Get-WmiObject Win32_MountPoint -ComputerName $Computer |
Where { if ($IncludeRootDrives) { $true } else { $_.Directory -NotMatch '^\s*Win32_Directory\.Name="[a-z]:\\{2}"\s*$' } } | ForEach-Object {
$MountPointData.(Get-DeviceIDFromMP $_.Volume $_.Directory) = $_.Directory
}
$Volumes = Get-WmiObject Win32_Volume -ComputerName $Computer | Where {
if ($IncludeRootDrives) { $true } else { -not $_.DriveLetter }
} |
Select-Object Label, Caption, Capacity, FreeSpace, FileSystem, DeviceID, @{n='Computer';e={$Computer}}
}
catch {
Write-Host -Fore Red "Terminating WMI error for ${Computer} (skipping): $($Error[0])"
continue
}
if (-not $Volumes) {
Write-Host -Fore Red "No mount points found on $Computer. Skipping..."
continue
}
$Volumes | ForEach-Object {
if ($MountPointData.ContainsKey($_.DeviceID)) {
if ($_.Capacity) { $PercentFree = $_.FreeSpace*100/$_.Capacity }
else { $PercentFree = 0 }
$_ | Select-Object Computer, Label, Caption, FileSystem, @{n='Size (GB)';e={$_.Capacity/1GB}},
@{n='Free space';e={($_.FreeSpace/1GB).ToString('N')}}, @{n='Percent free';e={$PercentFree}}
}
} | Sort-Object -Property 'Percent free', @{Descending=$true;e={$_.'Size (GB)'}}, Label, Caption |
Select-Object Computer, Label, Caption, FileSystem, @{n='Size (GB)';e={$_.'Size (GB)'.ToString('N')}},
'Free space', @{n='Percent free';e={$_.'Percent free'.ToString('N')}}
}
}