Information and announcements from Program Managers, Product Managers, Developers and Testers in the Microsoft Virtualization team.
In the following sample, we do a basic import of a VM using the new Import API. This script essentially does what the import UI does; it assumes all the necessary files are present in the import folder and imports from that directory. In a later blog, there will be a sample that will utilize the fine grained capabilities of import in Hyper-V R2. Many thanks to Madhan Gajendran and Dinesh Kumar Govindasamy again for writing this script:
option explicit
dim objWMIService
dim managementService
dim fileSystem
const JobStarting = 3
const JobRunning = 4
const JobCompleted = 7
const wmiStarted = 4096
const wmiSuccessful = 0
Main()
'-----------------------------------------------------------------
' Main
Sub Main()
dim computer, objArgs, importDirectory, generateNewID
set fileSystem = Wscript.CreateObject("Scripting.FileSystemObject")
computer = "."
set objWMIService = GetObject("winmgmts:\\" & computer & "\root\virtualization")
set managementService = objWMIService.ExecQuery("select * from Msvm_VirtualSystemManagementService").ItemIndex(0)
set objArgs = WScript.Arguments
if WScript.Arguments.Count = 1 then
importDirectory = objArgs.Unnamed.Item(0)
else
WScript.Echo "usage: cscript ImportVirtualSystemEx.vbs importDirectoryName"
WScript.Quit(1)
end if
if ImportVirtualSystemEx(importDirectory) then
WriteLog "Done"
WScript.Quit(0)
WriteLog "importDirectory Failed."
End Sub
' GetVirtualSystemImportSettingData from a directory
Function GetVirtualSystemImportSettingData(importDirectory)
dim objInParam, objOutParams
set objInParam = managementService.Methods_("GetVirtualSystemImportSettingData").InParameters.SpawnInstance_()
objInParam.ImportDirectory = importDirectory
set objOutParams = managementService.ExecMethod_("GetVirtualSystemImportSettingData", objInParam)
if objOutParams.ReturnValue = wmiStarted then
if (WMIJobCompleted(objOutParams)) then
set GetVirtualSystemImportSettingData = objOutParams.ImportSettingData
elseif objOutParams.ReturnValue = wmiSuccessful then
WriteLog Format1("ImportVirtualSystem failed with ReturnValue {0}", objOutParams.ReturnValue)
End Function
' ImportVirtualSystem from a directory
Function ImportVirtualSystemEx(importDirectory)
dim newDataRoot
dim importSettingData, copyDir, fileSysObj
ImportVirtualSystemEx = false
newDataRoot = importDirectory & "\NewCopy"
'Path in newDataRoot folder should be existing
set fileSysObj = CreateObject("Scripting.FileSystemObject")
if fileSysObj.FolderExists(newDataRoot) then
fileSysObj.DeleteFolder(newDataRoot)
copyDir = fileSysObj.CreateFolder(newDataRoot)
set objInParam = managementService.Methods_("ImportVirtualSystemEx").InParameters.SpawnInstance_()
set importSettingData = GetVirtualSystemImportSettingData(importDirectory)
importSettingData.GenerateNewId = true
importSettingData.CreateCopy = true
importSettingData.Name = "NewSampleVM"
importSettingData.TargetVmDataRoot = newDataRoot
importSettingData.TargetSnapshotDataRoot = newDataRoot
importSettingData.TargetVhdDataRoot = newDataRoot
importSettingData.Put_
objInParam.ImportSettingData = importSettingData.GetText_(1)
set objOutParams = managementService.ExecMethod_("ImportVirtualSystemEx", objInParam)
ImportVirtualSystemEx = true
' Handle wmi Job object
Function WMIJobCompleted(outParam)
dim WMIJob, jobState
set WMIJob = objWMIService.Get(outParam.Job)
WMIJobCompleted = true
jobState = WMIJob.JobState
while jobState = JobRunning or jobState = JobStarting
WriteLog Format1("In progress... {0}% completed.",WMIJob.PercentComplete)
WScript.Sleep(1000)
wend
if (jobState <> JobCompleted) then
WriteLog Format1("ErrorCode:{0}", WMIJob.ErrorCode)
WriteLog Format1("ErrorDescription:{0}", WMIJob.ErrorDescription)
WMIJobCompleted = false
' Create the console log files.
Sub WriteLog(line)
dim fileStream
set fileStream = fileSystem.OpenTextFile(".\ImportVirtualSystemEx.log", 8, true)
WScript.Echo line
fileStream.WriteLine line
fileStream.Close
'------------------------------------------------------------------------------
' The string formating functions to avoid string concatenation.
Function Format1(myString, arg0)
Format1 = Replace(myString, "{0}", arg0)
I have read and continue to read your article liked it very much thank
Can you please tell me if this script can be used to simultaneously import multiple VMs?
I need to import 5 servers and would like to just run this script once.
thanks
Ron
It copied from msdn.microsoft.com/.../dd379581%28v=vs.85%29
The same logic does not work on remote machine.