Private/GetVMHardDriveMap.ps1
function GetVMHardDriveMap { [CmdletBinding()] param () $mainActivity = "Generating a map of VHD files used in snapshots by VMs on the system" Write-Progress -Activity $mainActivity -Status "Getting a list of VMs from the Get-VM cmdlet" try { $vms = Get-VM -ErrorVariable err if ($err) { Write-Error "Failed to obtain a list of VMs from Get-VM. The error was: $err" return } if (!$vms) { Write-Verbose "No VMs were found on the system." return } $vmCount = $vms.Count $currentVM = 0 $driveMap = @{} Write-Progress -Activity $mainActivity -Status "Processing snapshots for $vmCount VM(s)" -PercentComplete 50 foreach ($vm in $vms) { $currentVM += 1 if (!$vm.ParentSnapshotId) { continue } $innerProgressSplat = @{ "Id" = 1 "Activity" = "Processing VM $($vm.Name) ($currentVM/$vmCount)" "PercentComplete" = [int](($currentVM / $vmCount) * 100) "Status" = "Processing snapshots for VM $($vm.Name) ($currentVM/$vmCount)" } Write-Progress @innerProgressSplat $snapshots = Get-VMSnapshot -VM $vm -ErrorVariable err if ($err) { Write-Warning "Failed to obtain a list of snapshots from VM '$($vm.Name)'. We will be unable to check if the VHD we're optimizing is being used by a snapshot in this VM, which may cause issues later on. The error was: $err" continue } if (!$snapshots) { Write-Warning "Didn't find any snapshots for VM '$($vm.Name)' despite it having a ParentSnapshotId. We will be unable to check if the VHD we're optimizing is being used by a snapshot in this VM, which may cause issues later on." continue } Write-Verbose "Found a VM ($($vm.Name)) which contains $($snapshots.Count) snapshot(s)." foreach ($snapshot in $snapshots) { foreach ($snapshotHdd in $snapshot.HardDrives) { if ($null -eq $driveMap[$snapshotHdd.Path]) { $driveMap[$snapshotHdd.Path] = New-Object "System.Collections.ArrayList" } [void]($driveMap[$snapshotHdd.Path].Add($vm)) } } } Write-Verbose "Found $($driveMap.Count) VHD(s) used in VM snapshots." return $driveMap } finally { Write-Progress -Activity $mainActivity -Completed Write-Progress -Id 1 -Activity "Finished" -Completed } } # Copyright (c) 2024 AJ Tek Corporation. All Rights Reserved. # SIG # Begin signature block # MIIVdAYJKoZIhvcNAQcCoIIVZTCCFWECAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB # gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR # AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQU3icfBKAvydak3kUgtSQP/9jx # /wegghHWMIIFbzCCBFegAwIBAgIQSPyTtGBVlI02p8mKidaUFjANBgkqhkiG9w0B # AQwFADB7MQswCQYDVQQGEwJHQjEbMBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVy # MRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEh # MB8GA1UEAwwYQUFBIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTIxMDUyNTAwMDAw # MFoXDTI4MTIzMTIzNTk1OVowVjELMAkGA1UEBhMCR0IxGDAWBgNVBAoTD1NlY3Rp # Z28gTGltaXRlZDEtMCsGA1UEAxMkU2VjdGlnbyBQdWJsaWMgQ29kZSBTaWduaW5n # IFJvb3QgUjQ2MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAjeeUEiIE # JHQu/xYjApKKtq42haxH1CORKz7cfeIxoFFvrISR41KKteKW3tCHYySJiv/vEpM7 # fbu2ir29BX8nm2tl06UMabG8STma8W1uquSggyfamg0rUOlLW7O4ZDakfko9qXGr # YbNzszwLDO/bM1flvjQ345cbXf0fEj2CA3bm+z9m0pQxafptszSswXp43JJQ8mTH # qi0Eq8Nq6uAvp6fcbtfo/9ohq0C/ue4NnsbZnpnvxt4fqQx2sycgoda6/YDnAdLv # 64IplXCN/7sVz/7RDzaiLk8ykHRGa0c1E3cFM09jLrgt4b9lpwRrGNhx+swI8m2J # mRCxrds+LOSqGLDGBwF1Z95t6WNjHjZ/aYm+qkU+blpfj6Fby50whjDoA7NAxg0P # OM1nqFOI+rgwZfpvx+cdsYN0aT6sxGg7seZnM5q2COCABUhA7vaCZEao9XOwBpXy # bGWfv1VbHJxXGsd4RnxwqpQbghesh+m2yQ6BHEDWFhcp/FycGCvqRfXvvdVnTyhe # Be6QTHrnxvTQ/PrNPjJGEyA2igTqt6oHRpwNkzoJZplYXCmjuQymMDg80EY2NXyc # uu7D1fkKdvp+BRtAypI16dV60bV/AK6pkKrFfwGcELEW/MxuGNxvYv6mUKe4e7id # FT/+IAx1yCJaE5UZkADpGtXChvHjjuxf9OUCAwEAAaOCARIwggEOMB8GA1UdIwQY # MBaAFKARCiM+lvEH7OKvKe+CpX/QMKS0MB0GA1UdDgQWBBQy65Ka/zWWSC8oQEJw # IDaRXBeF5jAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zATBgNVHSUE # DDAKBggrBgEFBQcDAzAbBgNVHSAEFDASMAYGBFUdIAAwCAYGZ4EMAQQBMEMGA1Ud # HwQ8MDowOKA2oDSGMmh0dHA6Ly9jcmwuY29tb2RvY2EuY29tL0FBQUNlcnRpZmlj # YXRlU2VydmljZXMuY3JsMDQGCCsGAQUFBwEBBCgwJjAkBggrBgEFBQcwAYYYaHR0 # cDovL29jc3AuY29tb2RvY2EuY29tMA0GCSqGSIb3DQEBDAUAA4IBAQASv6Hvi3Sa # mES4aUa1qyQKDKSKZ7g6gb9Fin1SB6iNH04hhTmja14tIIa/ELiueTtTzbT72ES+ # BtlcY2fUQBaHRIZyKtYyFfUSg8L54V0RQGf2QidyxSPiAjgaTCDi2wH3zUZPJqJ8 # ZsBRNraJAlTH/Fj7bADu/pimLpWhDFMpH2/YGaZPnvesCepdgsaLr4CnvYFIUoQx # 2jLsFeSmTD1sOXPUC4U5IOCFGmjhp0g4qdE2JXfBjRkWxYhMZn0vY86Y6GnfrDyo # XZ3JHFuu2PMvdM+4fvbXg50RlmKarkUT2n/cR/vfw1Kf5gZV6Z2M8jpiUbzsJA8p # 1FiAhORFe1rYMIIGGjCCBAKgAwIBAgIQYh1tDFIBnjuQeRUgiSEcCjANBgkqhkiG # 9w0BAQwFADBWMQswCQYDVQQGEwJHQjEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVk # MS0wKwYDVQQDEyRTZWN0aWdvIFB1YmxpYyBDb2RlIFNpZ25pbmcgUm9vdCBSNDYw # HhcNMjEwMzIyMDAwMDAwWhcNMzYwMzIxMjM1OTU5WjBUMQswCQYDVQQGEwJHQjEY # MBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMSswKQYDVQQDEyJTZWN0aWdvIFB1Ymxp # YyBDb2RlIFNpZ25pbmcgQ0EgUjM2MIIBojANBgkqhkiG9w0BAQEFAAOCAY8AMIIB # igKCAYEAmyudU/o1P45gBkNqwM/1f/bIU1MYyM7TbH78WAeVF3llMwsRHgBGRmxD # eEDIArCS2VCoVk4Y/8j6stIkmYV5Gej4NgNjVQ4BYoDjGMwdjioXan1hlaGFt4Wk # 9vT0k2oWJMJjL9G//N523hAm4jF4UjrW2pvv9+hdPX8tbbAfI3v0VdJiJPFy/7Xw # iunD7mBxNtecM6ytIdUlh08T2z7mJEXZD9OWcJkZk5wDuf2q52PN43jc4T9OkoXZ # 0arWZVeffvMr/iiIROSCzKoDmWABDRzV/UiQ5vqsaeFaqQdzFf4ed8peNWh1OaZX # nYvZQgWx/SXiJDRSAolRzZEZquE6cbcH747FHncs/Kzcn0Ccv2jrOW+LPmnOyB+t # AfiWu01TPhCr9VrkxsHC5qFNxaThTG5j4/Kc+ODD2dX/fmBECELcvzUHf9shoFvr # n35XGf2RPaNTO2uSZ6n9otv7jElspkfK9qEATHZcodp+R4q2OIypxR//YEb3fkDn # 3UayWW9bAgMBAAGjggFkMIIBYDAfBgNVHSMEGDAWgBQy65Ka/zWWSC8oQEJwIDaR # XBeF5jAdBgNVHQ4EFgQUDyrLIIcouOxvSK4rVKYpqhekzQwwDgYDVR0PAQH/BAQD # AgGGMBIGA1UdEwEB/wQIMAYBAf8CAQAwEwYDVR0lBAwwCgYIKwYBBQUHAwMwGwYD # VR0gBBQwEjAGBgRVHSAAMAgGBmeBDAEEATBLBgNVHR8ERDBCMECgPqA8hjpodHRw # Oi8vY3JsLnNlY3RpZ28uY29tL1NlY3RpZ29QdWJsaWNDb2RlU2lnbmluZ1Jvb3RS # NDYuY3JsMHsGCCsGAQUFBwEBBG8wbTBGBggrBgEFBQcwAoY6aHR0cDovL2NydC5z # ZWN0aWdvLmNvbS9TZWN0aWdvUHVibGljQ29kZVNpZ25pbmdSb290UjQ2LnA3YzAj # BggrBgEFBQcwAYYXaHR0cDovL29jc3Auc2VjdGlnby5jb20wDQYJKoZIhvcNAQEM # BQADggIBAAb/guF3YzZue6EVIJsT/wT+mHVEYcNWlXHRkT+FoetAQLHI1uBy/YXK # ZDk8+Y1LoNqHrp22AKMGxQtgCivnDHFyAQ9GXTmlk7MjcgQbDCx6mn7yIawsppWk # vfPkKaAQsiqaT9DnMWBHVNIabGqgQSGTrQWo43MOfsPynhbz2Hyxf5XWKZpRvr3d # MapandPfYgoZ8iDL2OR3sYztgJrbG6VZ9DoTXFm1g0Rf97Aaen1l4c+w3DC+IkwF # kvjFV3jS49ZSc4lShKK6BrPTJYs4NG1DGzmpToTnwoqZ8fAmi2XlZnuchC4NPSZa # PATHvNIzt+z1PHo35D/f7j2pO1S8BCysQDHCbM5Mnomnq5aYcKCsdbh0czchOm8b # kinLrYrKpii+Tk7pwL7TjRKLXkomm5D1Umds++pip8wH2cQpf93at3VDcOK4N7Ew # oIJB0kak6pSzEu4I64U6gZs7tS/dGNSljf2OSSnRr7KWzq03zl8l75jy+hOds9TW # SenLbjBQUGR96cFr6lEUfAIEHVC1L68Y1GGxx4/eRI82ut83axHMViw1+sVpbPxg # 51Tbnio1lB93079WPFnYaOvfGAA0e0zcfF/M9gXr+korwQTh2Prqooq2bYNMvUoU # KD85gnJ+t0smrWrb8dee2CvYZXD5laGtaAxOfy/VKNmwuWuAh9kcMIIGQTCCBKmg # AwIBAgIPcwNHI7C5de7gxMGrVQI4MA0GCSqGSIb3DQEBDAUAMFQxCzAJBgNVBAYT # AkdCMRgwFgYDVQQKEw9TZWN0aWdvIExpbWl0ZWQxKzApBgNVBAMTIlNlY3RpZ28g # UHVibGljIENvZGUgU2lnbmluZyBDQSBSMzYwHhcNMjUwNTE0MDAwMDAwWhcNMjgw # NTEzMjM1OTU5WjBZMQswCQYDVQQGEwJDQTEQMA4GA1UECAwHT250YXJpbzEbMBkG # A1UECgwSQUogVGVrIENvcnBvcmF0aW9uMRswGQYDVQQDDBJBSiBUZWsgQ29ycG9y # YXRpb24wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDWj5lzT7BGJNt7 # ROfLKz20/JHL0sneb1xB7nkYiftN+imojj5JtzL0zkpTxXwsLPX1mEVmahrTMhei # PIE5xnxIxp3FLXoCvNv0U1XhObPxaouUtNthL0+Crx+Jjm+K0r5EquO5sPC3kAiP # 87lZ544JORrMCE+4pCtqNy526ZN+ptSdMKG2sSTEbNYq5lMMmNQqCGKdL6cKS3+R # olCmYmagk+f97zBvYSsIiJrO/nwkyf38w2JZNlo+MJMAMTNPSy3mV4pEoTer2m5I # 8Z0NYv8TxypNcgJ8Pba+98Sm0TR3ofm428OsiHsnREQ1aXGdsutxcVEqgbkugTQA # zM+FCoY+PfeyyZwyCWGroqjjnyJeaWqopTN7rB38MSkiF8dZlEW42bGHNyc4LE2f # rtVDNSA6Fz4SvL4vpUZKKBjELqqH2FXfay/kf3Slx1FU3MxBclZ9rbsYA8S1yloh # mstaxxSL6GIuBJoOpaqgVBCRNClYOAgLcd2JLZZZbxn6xv0I5d4IgmvE2kPBSYuD # 1V+AezEtE87az0br0Js2G9RtsgoOpnDuC3p1LR0G5Nk1pMESf+QS/YiMhZP2sbyF # eB0Iw2QDfXIpskF5Oat7GDnlNp2UHwyib5sCTLHgJVfmvyfs1l46pvbf4V76sgaG # ++jTRv7H+3Np/iW4J3fYqdZ5i7mANwIDAQABo4IBiTCCAYUwHwYDVR0jBBgwFoAU # DyrLIIcouOxvSK4rVKYpqhekzQwwHQYDVR0OBBYEFD4d/dBFGRC8CXrLDsINXrsm # 8jtJMA4GA1UdDwEB/wQEAwIHgDAMBgNVHRMBAf8EAjAAMBMGA1UdJQQMMAoGCCsG # AQUFBwMDMEoGA1UdIARDMEEwNQYMKwYBBAGyMQECAQMCMCUwIwYIKwYBBQUHAgEW # F2h0dHBzOi8vc2VjdGlnby5jb20vQ1BTMAgGBmeBDAEEATBJBgNVHR8EQjBAMD6g # PKA6hjhodHRwOi8vY3JsLnNlY3RpZ28uY29tL1NlY3RpZ29QdWJsaWNDb2RlU2ln # bmluZ0NBUjM2LmNybDB5BggrBgEFBQcBAQRtMGswRAYIKwYBBQUHMAKGOGh0dHA6 # Ly9jcnQuc2VjdGlnby5jb20vU2VjdGlnb1B1YmxpY0NvZGVTaWduaW5nQ0FSMzYu # Y3J0MCMGCCsGAQUFBzABhhdodHRwOi8vb2NzcC5zZWN0aWdvLmNvbTANBgkqhkiG # 9w0BAQwFAAOCAYEAZmy+JTNIVX9nL8Qk1xVu0TzMQcDvw/eeoS6t3WFQU+BeWv0B # 5Lhzs3tX2oO/9TFJyMsJ7S5y1l1iORcv6I796H8F9+BKuhIkUVGiGWB9qumZHrwa # 6gGKMRofxnQ0MO3Bo2TQ4v8p/o1XUykmMm6FcAMaDXSWFTfe2Ks844CqiWXlxQ+K # O7SfP5KOPXRm3bTCP/R4qQG1ECHEIfmdNZe7F2Xu5Cyzcgs/zQT9CsPESBF5D+nF # sBY2FA9ptQqof2opA/Qhf0Sx4ZQ7IRp7KLmo2ukEBa6Btg3k744bpn0FI6ARx39H # cdytfYbveO6dKW/er3gvlOB+jguP6gY58MdLc+AIrpf9UQ9LOaphKpLgJKtnczzi # UBSohzzRU6jU2cTmxhgnf/yP6amgB4wwOYwoKppIYyrWRB//dahOpTbr+RAxrqD1 # TkIpjzaLq9wSnd21OpVhP3XGFnL+hKSL2mhH1hDRIF7krunlyQQkiHcUw6RXtr9b # gUE25oj4Z9zJbn0SMYIDCDCCAwQCAQEwZzBUMQswCQYDVQQGEwJHQjEYMBYGA1UE # ChMPU2VjdGlnbyBMaW1pdGVkMSswKQYDVQQDEyJTZWN0aWdvIFB1YmxpYyBDb2Rl # IFNpZ25pbmcgQ0EgUjM2Ag9zA0cjsLl17uDEwatVAjgwCQYFKw4DAhoFAKB4MBgG # CisGAQQBgjcCAQwxCjAIoAKAAKECgAAwGQYJKoZIhvcNAQkDMQwGCisGAQQBgjcC # AQQwHAYKKwYBBAGCNwIBCzEOMAwGCisGAQQBgjcCARUwIwYJKoZIhvcNAQkEMRYE # FGMKRBILN5V2X6cpAw4m8rNhYwiyMA0GCSqGSIb3DQEBAQUABIICAJyHoyqLh7qG # kETe3IP8bHzx+GoCzMLF609HJULkVQapRrHCQv1W8Cn8ZhOtkwv+DKUmANCV/NMg # kCg82wxMJto+6AHIpnrYTQQYHir69L/T9dfdSGH97kPvtJavuMsV6kGRbDedv7y+ # sFvo4kLjsMjhEkNVeFb49Div1TB6eYpn3XjB1LAzJrM28WYzLw87hOf/97Bgb68p # bXCkiAu0eA8GvFjaDjoJgsp52sS8rZkijxmIIo5tJFEL6OpCHj7d4+PPiWrXlP1D # n7xtgmf0o5fGxNeC3KSRE8vrCmAyqA39W7OpU2Kx4jD2dbPIIC1u2nxSrW+x+YQa # In60ll+APmCH3zcn7sN9l/jEJaVF5UeHxHi9pwWUWddzWDdlNnMC2NaXPvhiSmGs # CIY0TelFAAtohatRlwHXEvi3vJfjV5NG2gB1w22lBweFCfWR0VVpzO1E9URpXchX # yYpzTNit3anskqC2c1EcvRnC0Jxos90MZqRd/MiwB8OXcNwm0uCfqx7Ql3m3Uygn # 7xTiVDhosmUylbpBEm4USkJGxxcm/GE/q0hg2liGQV1GLodpww0xfEvjGYGmVsxZ # jDkQgMHg3sPfDJT4gAqkL464G44YjodFT1yCXGW6vl/7lTEBu7SDAuzKi5JPT2ki # zSCjw5NidMb9BZ5SFBlgcUr8v4rEDF7y # SIG # End signature block |