Welcome to MSDN Blogs Sign in | Join | Help

Hyper-V Script: Compact VHD

Continuing on with my walk through the storage WMI API - here are some scripts for compacting VHDs with Hyper-V.  Note that Hyper-V allows you to compact both differencing and dynamically expanding virtual hard disks.

PowerShell:

# Prompt for the Hyper-V Server to use
$HyperVServer = Read-Host "Specify the Hyper-V Server to use (enter '.' for the local computer)"
 
# Get name for VHD
$VHDName = Read-Host "Specify the name of the virtual had disk to compact"
 
# Get the Msvm_ImageManagementService object
$ImageManagementService = gwmi Msvm_ImageManagementService -namespace "root\virtualization" -computername $HyperVServer
 
# Compact the VHD
$result = $ImageManagementService.CompactVirtualHardDisk($VHDName)
 
#Return success if the return value is "0"
if ($Result.ReturnValue -eq 0)
   {write-host "The virtual hard disk has been compacted."} 
 
#If the return value is not "0" or "4096" then the operation failed
ElseIf ($Result.ReturnValue -ne 4096)
   {write-host "The virtual hard disk has not been compacted.  Error value:" $Result.ReturnValue}
 
  Else
   {#Get the job object
    $job=[WMI]$Result.job
 
    #Provide updates if the jobstate is "3" (starting) or "4" (running)
    while ($job.JobState -eq 3 -or $job.JobState -eq 4)
      {write-host "Compacting. "$job.PercentComplete "% complete"
       start-sleep 1
 
       #Refresh the job object
       $job=[WMI]$Result.job}
 
     #A jobstate of "7" means success
    if ($job.JobState -eq 7)
       {write-host "The virtual hard disk has been compacted."}
      Else
       {write-host "The virtual hard disk has not been compacted."
        write-host "ErrorCode:" $job.ErrorCode
        write-host "ErrorDescription" $job.ErrorDescription}
   }

VBScript:

Option Explicit
 
Dim HyperVServer
Dim VHDName
Dim WMIService
Dim Msvm_ImageManagementService
Dim Result
Dim Job
Dim InParam
Dim OutParam
 
'Prompt for the Hyper-V Server to use
HyperVServer = InputBox("Specify the Hyper-V Server to create the virtual machine on:")
 
'Get name for VHD
VHDName = InputBox("Specify the name of the virtual had disk to compact:")
 
'Get an instance of the WMI Service in the virtualization namespace.
Set WMIService = GetObject("winmgmts:\\" & HyperVServer & "\root\virtualization")
 
'Get the Msvm_ImageManagementService object
Set Msvm_ImageManagementService = WMIService.ExecQuery("SELECT * FROM Msvm_ImageManagementService").ItemIndex(0)
 
'Setup the input parameter list
Set InParam = Msvm_ImageManagementService.Methods_("CompactVirtualHardDisk").InParameters.SpawnInstance_()
InParam.Path = VHDName 
 
'Execute the method and store the results in OutParam
Set OutParam = Msvm_ImageManagementService.ExecMethod_("CompactVirtualHardDisk", InParam) 
 
'Check to see if the job completed synchronously
if (OutParam.ReturnValue = 0) then
   Wscript.Echo "The virtual hard disk has been compacted."
elseif (OutParam.ReturnValue <> 4096) then
   Wscript.Echo "The virtual hard disk has not been compacted."
else   
 
   'Get the job object
   set Job = WMIService.Get(OutParam.Job)
 
    'Wait for the job to complete (3 == starting, 4 == running)
   while (Job.JobState = 3) or (Job.JobState = 4)
      Wscript.Echo "Compacting. " & Job.PercentComplete & "% complete"
      WScript.Sleep(1000)
 
      'Refresh the job object
      set Job = WMIService.Get(OutParam.Job)
   Wend
 
   'Provide details if the job fails (7 == complete)
   if (Job.JobState <> 7) then
      Wscript.Echo "The virtual hard disk has not been compacted."
      Wscript.Echo "ErrorCode:" & Job.ErrorCode
      Wscript.Echo "ErrorDescription:" & Job.ErrorDescription
   else
      Wscript.Echo "The virtual hard disk has been compacted."
   end If
end if
Cheers,
Ben
Published Wednesday, June 11, 2008 9:33 AM by Virtual PC Guy

Comments

Wednesday, June 11, 2008 3:17 PM by Airline Travel &raquo; Hyper-V Script: Compact VHD

# Airline Travel &raquo; Hyper-V Script: Compact VHD

Thursday, June 12, 2008 11:55 AM by Kieran

# re: Hyper-V Script: Compact VHD

What is the purpose of compacting the VHDs though Ben?

Thursday, June 19, 2008 12:05 AM by Christopher Steen

# Link Listing - June 17, 2008

MSBuild MSBuild Reserved Properties [Via: Sayed Ibrahim Hashimi ] Sharepoint Adding Copy and Paste...

Tuesday, June 24, 2008 6:31 PM by aaron

# re: Hyper-V Script: Compact VHD

Thanks for all the great tips, they've been exceptionally helpful.

I have a server that is not hyper-v capable, but I would like to install the hyper-v tools to mount/defrag/compact vhds.  Is there a way to do this?

Thursday, June 26, 2008 10:53 AM by Yossi Ran

# re: Hyper-V Script: Compact VHD

I have just compacted a VHD

Size before compaction: 9,524,588,032

Size After  compaction: 9,355,077,632

Saturday, June 28, 2008 7:47 AM by Hyper-v

# Hyper-V Script: Compact VHD

here are some scripts for compacting VHDs with Hyper-V. Note that Hyper-V allows you to compact both

Sunday, June 29, 2008 8:09 AM by Hyper-v

# Hyper-V PowerShell library - now on Codeplex

James O&#39;Neill: I&#39;ve decided to go ahead and post the PowerShell library I have been working on

Monday, July 07, 2008 6:27 PM by HyperVoria

# Hyper-V Script: Compact VHD

here are some scripts for compacting VHDs with Hyper-V. Note that Hyper-V allows you to compact both

Wednesday, July 09, 2008 6:56 AM by aya2work

# re: Hyper-V Script: Compact VHD

Do I need to run pre-compactor tool (precompact.exe in VirtualServer) before compacting VHDs in Hyper-V?

Wednesday, July 09, 2008 3:44 PM by HyperVoria

# Hyper-V PowerShell library - now on Codeplex

James O&#39;Neill: I&#39;ve decided to go ahead and post the PowerShell library I have been working on

Tuesday, July 22, 2008 4:43 AM by Mark's Windows Server Blog

# Useful Hyper-V links

In the week or so since Hyper-V RTMed there has been a huge amount of coverage on various websites. Here&#39;s

New Comments to this post are disabled
 
Page view tracker