Skip to content

Instantly share code, notes, and snippets.

@DamianFlynn
Created September 2, 2014 14:41
Show Gist options
  • Select an option

  • Save DamianFlynn/afd3e12dc45aeec6a75e to your computer and use it in GitHub Desktop.

Select an option

Save DamianFlynn/afd3e12dc45aeec6a75e to your computer and use it in GitHub Desktop.
Blog: Compress VHD Disk Image Function [http://www.damianflynn.com/?p=5731]
Function Compress-DiskImage {
param (
[string]$VHDFile
)
process {
Write-Progress "Compress-DiskImage" "Calculating Current Metrics for $VHDFile" -id 1 -percentComplete 10
$FileSizeStart = Get-ChildItem $VHDFile | select length
Write-Progress "Compress-DiskImage - Pass 1" "Mounting Virtual Hard Disk $VHDFile in Read and Write Mode" -id 1 -percentComplete 10
$before = (Get-Volume).DriveLetter
Mount-DiskImage -ImagePath $VHDFile
$after = (Get-Volume).DriveLetter
$driveLetter = compare $before $after -Passthru
$driveLetter = $driveLetter + ":\"
Write-Progress "Compress-DiskImage" "Using DISM to Clean Up Windows Components in $VHDFile" -id 1 -percentComplete 20
DISM /Image:$driveLetter /Cleanup-Image /StartComponentCleanup /ResetBase
Write-Progress "Compress-DiskImage - Pass 1" "Defragmenting VHD $VHDFile mounted as $driveletter" -id 1 -percentComplete 30
defrag $driveletter /U /V /X
Write-Progress "Compress-DiskImage - Pass 1" "Mounting Virtual Hard Disk $VHDFile in Read Only Mode" -id 1 -percentComplete 40
Dismount-DiskImage -ImagePath $VHDFile -Verbose
$VHDData = Mount-DiskImage -ImagePath $VHDFile -Access ReadOnly -PassThru
Write-Progress "Compress-DiskImage - Pass 1" "Optimizing VHD $VHDFile mounted as $driveletter" -id 1 -percentComplete 50
$FileSizePass1 = $VHDData.FileSize
Optimize-VHD -Path $VHDFile -Mode Full
Dismount-DiskImage -ImagePath $VHDFile -Verbose
Write-Progress "Compress-DiskImage - Pass 2" "Mounting Virtual Hard Disk $VHDFile in Read and Write Mode" -id 1 -percentComplete 60
$before = (Get-Volume).DriveLetter
Mount-DiskImage -ImagePath $VHDFile
$after = (Get-Volume).DriveLetter
$driveLetter = compare $before $after -Passthru
$driveLetter = $driveLetter + ":\"
Write-Progress "Compress-DiskImage - Pass 2" "Defragmenting VHD $VHDFile mounted as $driveletter" -id 1 -percentComplete 70
defrag $driveletter /U /V /X
Write-Progress "Compress-DiskImage - Pass 2" "Mounting Virtual Hard Disk $VHDFile in Read Only Mode" -id 1 -percentComplete 80
Dismount-DiskImage -ImagePath $VHDFile -Verbose
$VHDData = Mount-DiskImage -ImagePath $VHDFile -Access ReadOnly -PassThru
$FileSizePass2 = $VHDData.FileSize
Write-Progress "Compress-DiskImage - Pass 2" "Optimizing VHD $VHDFile mounted as $driveletter" -id 1 -percentComplete 90
Optimize-VHD -Path $VHDFile -Mode Full
Dismount-DiskImage -ImagePath $VHDFile -Verbose
Write-Progress "Compress-DiskImage" "Completed Compress Procedure for VHD $VHDFile" -id 1 -percentComplete 100
$FileSizeEnd = Get-ChildItem $VHDFile | select length
New-Object PSObject -Property @{
FileName = $VHDFile
InitialFileSize = $FileSizeStart.Length
OptimizedFileSize = $FileSizeEnd.Length
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment