Functions/Get-DriveStat.ps1

function Get-DriveStat {
<#
.SYNOPSIS
    To get statistics on drives on a particular server or servers.
.DESCRIPTION
    To get statistics on drives on a server including Size, FreeSpace, and FreePct. Command line
    parameter allows for capacity statistics in Bytes, KB, MB, and GB
.EXAMPLE
    Get-DriveStat
 
    ComputerName DeviceID VolumeName SizeGB FreeSpaceGB FreePct
    ------------ -------- ---------- ------ ----------- -------
    localhost C: Windows 237.14 19.56 8.25
.EXAMPLE
    Get-DriveStat -Capacity MB
 
    ComputerName DeviceID VolumeName SizeMB FreeSpaceMB FreePct
    ------------ -------- ---------- ------ ----------- -------
    localhost C: Windows 242831.45 20026.65 8.25
.EXAMPLE
    Get-DriveStat -Verbose
 
    VERBOSE: Starting Get-DriveStat
    VERBOSE: Capacity will be expressed in [GB]
    VERBOSE: Processing MDA-102192
 
    ComputerName : localhost
    DeviceID : C:
    VolumeName : Windows
    SizeGB : 237.14
    FreeSpaceGB : 19.56
    FreePct : 8.25
 
    VERBOSE: Ending Get-DriveStat
#>


    # fixme Only works in Powershell 5.x

    #region Parameters
    [CmdletBinding()]
    [OutputType('psobject')]
    Param (
        [Parameter(Position=0)]
        [ValidateNotNullorEmpty()]
        [Alias('Server','ServerName','PSComputerName','SystemName')]
        [string[]] $ComputerName = $env:COMPUTERNAME,

        [Parameter(Position=1)]
        [ValidateSet('Bytes','KB','MB','GB')]
        [string] $Capacity = 'GB'

    )
    #endregion Parameters

    begin {
        Write-Verbose -Message "Starting $($MyInvocation.Mycommand)"
        Write-Verbose -Message "Capacity will be expressed in [$Capacity]"
        $Query = "Select * from Win32_LogicalDisk where DriveType='3' and FileSystem='NTFS'"
    }

    process {
        foreach ($C in $ComputerName) {
            write-verbose -Message "Processing $c"
            $DriveStat = Get-WmiObject -Query $Query -ComputerName $C
            switch ($Capacity) {
            'Bytes' {
                $DriveStat |
                    Select-Object -Property @{name='ComputerName';expression={$_.SystemName}},
                        DeviceID,
                        VolumeName,
                        Size,
                        FreeSpace,
                        @{name='FreePct';expression={[double] ('{0:f2}' -f ($_.FreeSpace / $_.Size * 100))}}
            }

            'KB' {
                $DriveStat |
                    Select-Object -Property @{name='ComputerName';expression={$_.SystemName}},
                        DeviceID,
                        VolumeName,
                        @{name='SizeKB'     ;expression={[double] ('{0:f2}' -f ($_.Size/1KB))}},
                        @{name='FreeSpaceKB';expression={[double] ('{0:f2}' -f ($_.FreeSpace/1KB))}},
                        @{name='FreePct'    ;expression={[double] ('{0:f2}' -f ($_.FreeSpace / $_.Size * 100))}}
            }

            'MB' {
                $DriveStat |
                    Select-Object -Property @{name='ComputerName';expression={$_.SystemName}},
                        DeviceID,
                        VolumeName,
                        @{name='SizeMB'     ;expression={[double] ('{0:f2}' -f ($_.Size/1MB))}},
                        @{name='FreeSpaceMB';expression={[double] ('{0:f2}' -f ($_.FreeSpace/1MB))}},
                        @{name='FreePct'    ;expression={[double] ('{0:f2}' -f ($_.FreeSpace / $_.Size * 100))}}
            }

            'GB' {
                $DriveStat |
                    Select-Object -Property @{name='ComputerName';expression={$_.SystemName}},
                        DeviceID,
                        VolumeName,
                        @{name='SizeGB'     ;expression={[double] ('{0:f2}' -f ($_.Size/1GB))}},
                        @{name='FreeSpaceGB';expression={[double] ('{0:f2}' -f ($_.FreeSpace/1GB))}},
                        @{name='FreePct'    ;expression={[double] ('{0:f2}' -f ($_.FreeSpace / $_.Size * 100))}}
            }
            }
        }

    }

    end {
        Write-Verbose -Message "Ending $($MyInvocation.Mycommand)"
    }

}