可通过PowerShell结合Get-VHD、Get-VMHardDiskDrive及Guest Service Interface获取VHDX真实使用情况:FileSize表物理占用,UsedSize(需TRIM支持)表客户系统实际写入量,UsePct反映膨胀率,Invoke-Command可获取客户OS内磁盘使用率。
可以通过 powershell 获取虚拟磁盘(如 hyper-v 虚拟硬盘 vhd/vhdx)的使用统计,核心是结合 get-vhd、get-vmharddiskdrive 和文件系统命令,从容量、已用空间、动态增长状态等维度提取真实使用情况。
获取单个 VHDX 文件的详细使用信息
Get-VHD 是最直接的命令,能读取 VHDX 文件的逻辑容量、已使用大小(对动态/差分盘有效)、文件大小等关键指标:
- 运行
Get-VHD "D:\VMs\Win10.vhdx"返回对象包含:FileSize(磁盘文件实际占用的物理空间)、Size(最大逻辑容量)、MinimumSize(最小分配空间,仅限动态盘)、FragmentationPercentage(碎片率) - 注意:FileSize ≠ 已用空间。动态盘的
FileSize是当前分配的块总和,而UsedSize字段(PowerShell 5.1+)才表示客户操作系统内实际写入的数据量(需 VHDX 启用“启用释放未使用空间”且客户 OS 支持 TRIM/UNMAP) - 若
UsedSize不显示,可手动估算:用Get-ChildItem查文件大小,再结合Get-Volume或fsutil volume diskfree分析底层卷使用率作参考
批量扫描所有 VHDX 并汇总使用率
在虚拟机存储目录下递归查找并统计,适合运维巡检:
- 执行:
Get-ChildItem "D:\VMs" -Recurse -Filter "*.vhdx" | Get-VHD | Select Path,FileSize,Size,UsedSize,@{n='UsePct';e={if($_.Size){[math]::Round($_.FileSize/$_.Size*100,1)}}} | Sort-Object UsePct -Descending - 该命令输出每个 VHDX 的路径、文件大小、逻辑容量、已用数据量(如有)、以及文件大小占逻辑容量的百分比(反映空间膨胀程度)
- 对动态盘,
UsePct接近 100% 表示已几乎填满;对固定盘,FileSize恒等于Size,此时应重点关注UsedSize是否接近Size
关联虚拟机获取实时挂载与使用上下文
单独查 VHDX 文件不够,还需知道它被哪台 VM 使用、是否在线、是否为系统盘:
- 先用
$drives = Get-VMHardDiskDrive -VMName *获取所有已挂载的虚拟硬盘配置 - 再通过
$drives | ForEach-Object { $vhd = Get-VHD $_.Path; [PSCustomObject]@{VMName=$_.VMName;ControllerType=$_.ControllerType;VHDPath=$_.Path;FileSize=$vhd.FileSize;Size=$vhd.Size;Status=$vhd.HealthStatus}}关联输出 - 这样就能看出:某台正在运行的 VM 是否挂载了高膨胀率的动态盘,或某 VHDX 是否已被卸载但文件仍残留(可清理)
检查客户操作系统内空间(需启用 Guest Service Interface)
若需精确到客户 OS 内部的磁盘使用(如 C:\ 剩余多少 GB),必须通过 Hyper-V 集成服务获取:
- 确保 VM 已启用 Guest Service Interface(在 VM 设置 → 集成服务中勾选)
- 运行:
Invoke-Command -VMName "Win10-Test" -ScriptBlock { Get-PSDrive C | Select Used,Free,UsedPercent } - 该方式返回的是客户系统视角的真实利用率,与
Get-VHD的宿主视角互补——例如客户删了文件但没执行Optimize-VHD -Mode Full,两者数值就会明显差异

















