MergeVirtualHardDisk method of the Msvm_ImageManagementService class
Merges a differencing virtual hard disk file with its parents. If the user executing this function does not have permission to update the virtual machines, then this function will fail.
Syntax
uint32 MergeVirtualHardDisk( [in] string SourcePath, [in] string DestinationPath, [out] CIM_ConcreteJob REF Job );
Parameters
- SourcePath [in]
-
Type: string
A fully qualified path that specifies the location of the merging file.
- DestinationPath [in]
-
Type: string
A fully qualified path that specifies the location of the parent disk image file into which data is to be merged. This could be the immediate parent virtual disk image of the merging file or parent disk image few levels up the differencing drive chain.
- Job [out]
-
Type: CIM_ConcreteJob
A reference to the job (can be null if the task is completed).
Return value
Type: uint32
This method can return one of the following values.
- Completed with No Error (0)
- Method Parameters Checked - JobStarted (4096)
- Failed (32768)
- Access Denied (32769)
- Not Supported (32770)
- Status is unknown (32771)
- Timeout (32772)
- Invalid parameter (32773)
- System is in use (32774)
- Invalid state for this operation (32775)
- Incorrect data type (32776)
- System is not available (32777)
- Out of memory (32778)
- File Not Found (32779)
Remarks
Access to the Msvm_ImageManagementService class might be restricted by UAC Filtering. For more information, see User Account Control and WMI.
Examples
The following C# example merges a differencing virtual hard disk file. The referenced utilities can be found in Common Utilities for the Virtualization Samples.
using System; using System.Management; namespace HyperVSamples { class MergeVHD { static void MergeVirtualHardDisk(string sourcePath, string destinationPath) { ManagementScope scope = new ManagementScope(@"root\virtualization", null); ManagementObject imageService = Utility.GetServiceObject(scope, "Msvm_ImageManagementService"); ManagementBaseObject inParams = imageService.GetMethodParameters("MergeVirtualHardDisk"); inParams["SourcePath"] = sourcePath; inParams["DestinationPath"] = destinationPath; ManagementBaseObject outParams = imageService.InvokeMethod("MergeVirtualHardDisk", inParams, null); if ((UInt32)outParams["ReturnValue"] == ReturnCode.Started) { if (Utility.JobCompleted(outParams, scope)) { Console.WriteLine("{0} was merged successfully.", inParams["SourcePath"]); } else { Console.WriteLine("Unable to merge {0}", inParams["SourcePath"]); } } inParams.Dispose(); outParams.Dispose(); imageService.Dispose(); } static void Main(string[] args) { if (args != null && args.Length != 2) { Console.WriteLine("Usage: MergeVHD SourcePath, DestinationPath"); return; } MergeVirtualHardDisk(args[0], args[1]); } } }
The following VBScript example merges a differencing virtual hard disk file.
option explicit dim objWMIService dim managementService dim fileSystem const JobStarting = 3 const JobRunning = 4 const JobCompleted = 7 const wmiStarted = 4096 const method = "" Main() '----------------------------------------------------------------- ' Main '----------------------------------------------------------------- Sub Main() dim sourcePath, destinationPath, computer, objArgs set fileSystem = Wscript.CreateObject("Scripting.FileSystemObject") computer = "." set objWMIService = GetObject("winmgmts:\\" & computer & "\root\virtualization") set managementService = objWMIService.ExecQuery("Select * from Msvm_ImageManagementService").ItemIndex(0) set objArgs = WScript.Arguments if WScript.Arguments.Count = 2 then sourcePath = objArgs.Unnamed.Item(0) destinationPath = objArgs.Unnamed.Item(1) else WScript.Echo "usage: cscript ConvertVHD.vbs sourcePath destinationPath" WScript.Quit(1) end if if MergeVirtualHardDisk(sourcePath, destinationPath) then WriteLog "Done" WScript.Quit(0) else WriteLog "ConvertVHD failed" WScript.Quit(1) end if End Sub '----------------------------------------------------------------- ' Execute MergeVirtualHardDisk '----------------------------------------------------------------- Function MergeVirtualHardDisk(sourcePath, destinationPath) WriteLog Format2("Sub MergeVirtualHardDisk({0}, {1})", sourcePath, DestinationPath) dim objInParam, objOutParams MergeVirtualHardDisk = false set objInParam = managementService.Methods_("MergeVirtualHardDisk").InParameters.SpawnInstance_() objInParam.SourcePath = SourcePath objInParam.DestinationPath = DestinationPath set objOutParams = managementService.ExecMethod_("MergeVirtualHardDisk", objInParam) if (WMIMethodStarted(objOutParams)) then if (WMIJobCompleted(objOutParams)) then WriteLog Format2("'{0}' was successfully merged into '{1}'.", sourcePath, destinationPath) MergeVirtualHardDisk = true end if end if End Function '----------------------------------------------------------------- ' Handle wmi return values '----------------------------------------------------------------- Function WMIMethodStarted(outParam) WriteLog "Function WMIMethodStarted" dim wmiStatus WMIMethodStarted = false if Not IsNull(outParam) then wmiStatus = outParam.ReturnValue if wmiStatus = wmiStarted then WMIMethodStarted = true else WriteLog Format1("Merge operation failed to create ConcreteJob with error {2}", wmiStatus) end if end if End Function '----------------------------------------------------------------- ' Handle wmi Job object '----------------------------------------------------------------- Function WMIJobCompleted(outParam) WriteLog "Function WMIJobCompleted" 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) set WMIJob = objWMIService.Get(outParam.Job) jobState = WMIJob.JobState wend if (jobState <> JobCompleted) then WriteLog Format1("ErrorCode:{0}", WMIJob.ErrorCode) WriteLog Format1("ErrorDescription:{0}", WMIJob.ErrorDescription) WMIJobCompleted = false end if End Function '----------------------------------------------------------------- ' Create the console log files. '----------------------------------------------------------------- Sub WriteLog(line) dim fileStream set fileStream = fileSystem.OpenTextFile(".\MergeVHD.log", 8, true) WScript.Echo line fileStream.WriteLine line fileStream.Close End Sub '------------------------------------------------------------------------------ ' The string formatting functions to avoid string concatenation. '------------------------------------------------------------------------------ Function Format3(myString, arg0, arg1, arg2) Format3 = Format2(myString, arg0, arg1) Format3 = Replace(Format3, "{2}", arg2) End Function '------------------------------------------------------------------------------ ' The string formatting functions to avoid string concatenation. '------------------------------------------------------------------------------ Function Format2(myString, arg0, arg1) Format2 = Format1(myString, arg0) Format2 = Replace(Format2, "{1}", arg1) End Function '------------------------------------------------------------------------------ ' The string formatting functions to avoid string concatenation. '------------------------------------------------------------------------------ Function Format1(myString, arg0) Format1 = Replace(myString, "{0}", arg0) End Function
Requirements
|
Minimum supported client | None supported |
|---|---|
|
Minimum supported server | Windows Server 2008 |
|
Namespace |
\\.\Root\Virtualization |
|
MOF |
|
See also
Build date: 7/3/2012