How To : 仅导出Hyper-V R2的虚拟机配置文件
最近想把所有实验虚拟机文件搬个机器,但所有的虚拟磁盘模板文件、差异磁盘文件、快照文件等目录错综复杂,参考了苏繁博客的“深入学习 Hyper-V 的导出和导入”一文有些想法:
1、将原有的Hyper-V目录(包括VHD、快照其它XML)拷贝到目标机器相同分区的相同目录
2、在旧环境中导出虚拟机配置文件
3、在新环境中导入备份的虚拟机配置文件
通过以上方法,就可以在不打乱原有目录的情况下快速将虚拟机实现环境转移
问题来了
苏繁的Hyper-V导出截图如下:
我自己环境的虚拟机导出截图如下:
在我的环境中,根本就没“仅导出虚拟机配置”这个选项,难道是我RP问题?
解决方案
查了微软MSDN后,发现微软在Hyper-V R2中,已经将“仅导出虚拟机配置”这个选项从UI当中移除了(我还以为是苏繁人品爆发了呢
),但微软的API中仍保留了此导出功能。没办法,只能通过脚本来直接调用了:
'================================================================== ' ' VBScript Source File ' ' NAME: Hyper-V R2 Configuration only Export ' ' AUTHOR: Billy Fu ' ' DATE : 2010/8/6 '================================================================== On Error Resume Next Dim HyperVServer Dim VMName Dim ExportPath Dim WMIService Dim Msvm_VirtualSystemManagementService Dim query Dim vm Dim InParam Dim exportSettingData Dim OutParam Dim Job HyperVServer = InputBox("指定要导出虚拟机的Hyper-V服务器,本机请用点表示:") VMName = InputBox("指定要导出配置的虚拟机名称:") ExportPath = InputBox("指定导出配置文件的存放路径:") Set WMIService = GetObject("winmgmts:\" & HyperVServer & "rootvirtualization") Set Msvm_VirtualSystemManagementService = WMIService.ExecQuery("Select * from Msvm_VirtualSystemManagementService").ItemIndex(0) query = "select * from Msvm_ComputerSystem where ElementName = '" & VMName & "'" Set vm = WMIService.ExecQuery(query).ItemIndex(0) Set InParam = Msvm_VirtualSystemManagementService.Methods_("ExportVirtualSystemEx").InParameters.SpawnInstance_() InParam.ComputerSystem = vm.Path_.Path Set exportSettingData = (vm.Associators_("Msvm_SystemExportSettingData", "Msvm_VirtualSystemExportSettingData")).ItemIndex(0) exportSettingData.CopyVmStorage = False exportSettingData.CopyVmRuntimeInformation = true exportSettingData.CreateVmExportSubdirectory = true exportSettingData.CopySnapshotConfiguration = 0 InParam.ExportSettingData = exportSettingData.GetText_(1) InParam.ExportDirectory = ExportPath Set OutParam = Msvm_VirtualSystemManagementService.ExecMethod_("ExportVirtualSystemEx", InParam) if (OutParam.ReturnValue = 0) then Wscript.Echo "虚拟机配置导出成功!" elseif (OutParam.ReturnValue <> 4096) then Wscript.Echo "虚拟机配置导出失败!" else set Job = WMIService.Get(OutParam.Job) While (Job.JobState = 3) or (Job.JobState = 4) Wscript.Echo "正在导出. " WScript.Sleep(1000) set Job = WMIService.Get(OutParam.Job) Wend if (Job.JobState <> 7) Then Wscript.Echo "虚拟机配置导出失败!" Wscript.Echo "错误代码:" & Job.ErrorCode Wscript.Echo "错误描述:" & Job.ErrorDescription Else Wscript.Echo "虚拟机配置导出成功!" end If end If
通过以上VBS脚本,偶也顺利将虚拟机的配置文件导出了
导出后的配置文件情况如下:

哈哈,我正纳闷怎么R2中的导出配置文件没有了,原来是设计使然。不过你这篇博文可解决了这个问题,很有价值。脚本写的这么出色!怎么样我出个好点子你再写个脚本如何!?估计很有很多网友喜爱。
@goxia
你说来我听听呢?但愿不要被难倒。。。
@碎片
选中一个文件或文件夹,鼠标右键将其打包为一个wim文件,或mount wim。如果实现利用率将会非常高!