PowerShell批量管理VHD/VHDX的核心是将磁盘文件作为可编程对象统一操作,支持批量创建、挂载、初始化、分区、格式化、卸载和清理;适用于Hyper-V、开发测试及自动化运维,关键命令包括New-VHD、Mount-VHD、Initialize-Disk、New-Partition和Format-Volume。
powershell 批量管理虚拟磁盘文件(vhd/vhdx)的核心在于:把磁盘文件当作可编程对象统一操作,而不是逐个手动挂载、格式化或删除。它适用于本地 hyper-v 环境、开发测试场景、标准化部署或自动化运维流程,支持批量创建、挂载、初始化、分区、格式化、卸载和清理。
批量创建 VHD/VHDX 文件
适合快速准备一批测试用虚拟磁盘,例如为 10 台虚拟机预配独立数据盘。
- 使用
New-VHD命令生成多个固定大小或动态扩展的磁盘文件:$basePath = "D:\VDisks" $vmNames = "App01", "App02", "App03", "DB01", "DB02"
foreach ($name in $vmNames) { $vhdPath = Join-Path $basePath "$name-Data.vhdx" New-VHD -Path $vhdPath -SizeBytes 50GB -Dynamic -Format VHDX }
- 关键参数说明:
- `-Dynamic`:创建动态扩展类型(节省初始空间);去掉则为固定大小(性能更稳)
- `-Format VHDX`:推荐使用,支持大于2TB、断电保护;如需兼容 Windows 7,改用 `-Format VHD`
- `-SizeBytes`:单位为字节,可用 `50GB`、`100GB` 等简写
---
### 批量挂载并初始化虚拟磁盘
创建完 VHD/VHDX 后,需挂载为系统识别的物理磁盘,再初始化才能使用。
- 自动挂载所有 `.vhdx` 文件,并初始化为 GPT 分区表:
```powershell
Get-ChildItem "D:\VDisks\*.vhdx" | ForEach-Object {
$disk = Mount-VHD -Path $_.FullName -Passthru
# 等待磁盘状态就绪(避免初始化失败)
Start-Sleep -Seconds 1
Initialize-Disk -Number $disk.DiskNumber -PartitionStyle GPT -Confirm:$false
}- 注意事项:
-
Mount-VHD -Passthru返回挂载后的磁盘对象,可直接获取DiskNumber - 初始化前加
Start-Sleep是因挂载存在延迟,否则Initialize-Disk可能报错“无法访问设备” - 若需 MBR(如旧系统兼容),将
-PartitionStyle GPT改为-PartitionStyle MBR
-
批量新建简单卷并格式化
初始化后,还需创建分区、分配盘符、格式化为 NTFS 才能被 Windows 正常读写。
Windows 命令行编码与兼容规范。涵盖 GBK/UTF-8 编码、PowerShell/pwsh 互操作、Python/Node.js、Git 配置及代码生成规则。适用于 Windows 10/11 + MSYS2/Git Bash 环境下的所有命令行操作。
- 对所有已挂载且未分配空间的磁盘执行分区与格式化:
Get-Disk | Where-Object {$_.ProvisioningType -eq 'Unknown' -and $_.OperationalStatus -eq 'Online'} | ForEach-Object { $diskNum = $_.Number $partition = New-Partition -DiskNumber $diskNum -UseMaximumSize -AssignDriveLetter Format-Volume -DriveLetter $partition.DriveLetter -FileSystem NTFS -NewFileSystemLabel "VDATA-$diskNum" -Confirm:$false -Force } - 补充说明:
-
ProvisioningType -eq 'Unknown'表示该磁盘尚未分区(即刚初始化完的状态) -
New-Partition -AssignDriveLetter自动分配下一个可用盘符(如 E:、F:) -
Format-Volume中-Force可跳过确认提示,适合无人值守脚本
-
批量卸载并清理虚拟磁盘文件
测试完成后,可一键卸载所有已挂载的 VHD/VHDX 并删除文件(谨慎执行):
- 卸载所有当前挂载的虚拟磁盘:
Get-VHD | Where-Object {$_.Attached -eq $true} | Dismount-VHD - 删除指定目录下所有
.vhdx文件(建议先备份或加确认):Remove-Item "D:\VDisks\*.vhdx" -Confirm:$false -Force
- 安全建议:
- 生产环境务必加
-WhatIf参数预览操作影响,例如Remove-Item ... -WhatIf - 可配合
Export-Clixml在卸载前导出磁盘映射关系,便于回溯
- 生产环境务必加
不复杂但容易忽略。

















