Functions/Get-HyperVStorageCommit.ps1


function Get-HyperVStorageCommit {
    [CmdletBinding()]
    param (
        [Parameter(Mandatory)] [string] $Driveletter
    )

    $Volume = Get-Volume $Driveletter -ea Stop


    $VHDFiles = Get-ChildItem "$($Driveletter):\" -Recurse -Filter "*.VHDX" -ea 0

    if (!($VHDFiles)) {
        Write-Warning "No VHD files found on volume $Driveletter"
        break
    }

    $TotalVHDSize = 0
    $VHDResult = @()

    foreach ($VHD in $VHDFiles) {
        $VHDProperties = Get-VHD $VHD.fullname

        $obj = [PSCustomObject]@{
            Path     = $VHDProperties.Path
            FileSize = $VHDProperties.FileSize
            Size     = $VHDProperties.Size
        }
        $VHDResult += $obj

        $TotalVHDSize = $TotalVHDSize + $VHDProperties.Size

    }
    if (!($TotalVHDSize)) {
        Write-Error "No VHD files found on volume $Driveletter"
        break
    }

    # $VHDResult | Format-Table

    # Write-Host "------------"

    $Result = [PSCustomObject]@{
        "Volume Drive Letter"   = $Volume.DriveLetter
        "Volume Total Size"     = [math]::Round( ($Volume.Size / 1024 / 1024 / 1024) , 2)
        "Volume Size Remaining" = [math]::Round( ($Volume.SizeRemaining / 1024 / 1024 / 1024) , 2)
        "Total VHD Size"        = [math]::Round( ($TotalVHDSize / 1024 / 1024 / 1024) , 2)
        "VHD Commit Size Left"  = [math]::Round( (($Volume.Size - $TotalVHDSize) / 1024 / 1024 / 1024) , 2)
    }

    return $Result

    if ($Result."VHD Commit Size Left" -lt 1) {
        Write-Host "VHD size overcommitted!" -ForegroundColor Red
    } else {
        Write-Host "VHD size not overcommitted" -ForegroundColor Green
    }

}