PowerShell 批量导出 Hyper-V 虚拟机配置的核心是组合 Get-VM 与导出命令,支持 CSV/XML/自定义格式;可导出基础信息、完整属性、磁盘网卡详情,并按状态、代次、动态内存等条件筛选后导出。
用 powershell 批量导出 hyper-v 虚拟机配置,核心是组合 get-vm 与导出命令,把每台虚拟机的关键属性或完整对象结构化保存为 csv、xml 或自定义格式。不需要逐台操作,一条管道就能覆盖全部运行中或指定状态的虚拟机。
导出所有虚拟机基础配置到 CSV
这是最常用、最直观的方式,适合快速查看和横向对比 CPU、内存、状态等字段:
- 运行:
Get-VM | Select-Object Name, State, ProcessorCount, MemoryAssigned, Generation, Uptime, AutomaticStartAction | Export-Csv -Path "C:\vm-summary.csv" -NoTypeInformation -
MemoryAssigned单位是字节,如需 MB 可改写为:[math]::Round($_.MemoryAssigned / 1MB) - 导出后可用 Excel 打开,支持排序、筛选,比如只看“Running”状态或“Generation 2”的虚拟机
导出每台虚拟机的完整属性(含隐藏字段)
当需要排查问题或做深度审计时,Select-Object * 能暴露所有可用属性,包括未在默认视图显示的设置项:
- 命令示例:
Get-VM | ForEach-Object { $_ | Select-Object * | Add-Member -NotePropertyName ExportTime -NotePropertyValue (Get-Date) -PassThru } | Export-Csv "C:\vm-full-detail.csv" -NoTypeInformation - 这样导出的 CSV 包含
AutomaticStopAction、ResourceMeteringEnabled、IsClustered等运维关键字段 - 注意:CSV 文件可能较大,建议先用
Get-VM | Measure-Object查看数量,避免导出上百台时内存占用过高
批量导出磁盘与网卡详细信息
单靠 Get-VM 不包含硬盘路径、控制器类型或 MAC 地址等细节,需配合专用 cmdlet 并关联输出:
- 导出所有 VM 的磁盘路径和大小:
Get-VM | ForEach-Object { $vm = $_; Get-VMDiskDrive -VMName $vm.Name | ForEach-Object { Get-VHD $_.Path | Select-Object @{n='VMName';e={$vm.Name}}, Path, FileSize, Size, LogicalSectorSize } } | Export-Csv "C:\vm-disks.csv" -NoTypeInformation - 导出网卡配置(交换机名、MAC、SR-IOV 状态):
Get-VM | ForEach-Object { $vm = $_; Get-VMNetworkAdapter -VMName $vm.Name | Select-Object @{n='VMName';e={$vm.Name}}, Name, SwitchName, MacAddress, IsSriovEnabled } | Export-Csv "C:\vm-nics.csv" -NoTypeInformation - 这些数据可直接用于容量规划或合规检查,比如确认是否所有生产 VM 都启用了 SR-IOV
按条件筛选后导出(如仅导出关机或动态内存启用的 VM)
运维中常需聚焦特定子集,用 Where-Object 过滤再导出更高效:
- 只导出已关机且为第二代的虚拟机:
Get-VM | Where-Object { $_.State -eq 'Off' -and $_.Generation -eq 2 } | Select-Object Name, ProcessorCount, MemoryAssigned, Path | Export-Csv "C:\offline-gen2.csv" -NoTypeInformation - 检查动态内存是否启用:
Get-VM | Get-VMMemory | Where-Object DynamicMemoryEnabled | ForEach-Object { [PSCustomObject]@{ VMName=$_.VMName; MinimumMB=[math]::Round($_.MinimumBytes/1MB); MaximumMB=[math]::Round($_.MaximumBytes/1MB); StartupMB=[math]::Round($_.StartupBytes/1MB) } } | Export-Csv "C:\vm-dynamic-memory.csv" -NoTypeInformation - 过滤后导出能减少冗余数据,也方便后续自动化脚本调用











