For almost a year ago, I posted a simple one-liner to list all VMs who has ISOs mounted. You can view that post here: http://cloud.kemta.net/2013/10/powershell-vmware-list-all-vms-with-iso-mounted-and-dismount-them/

That post was written before I truly discovered the major advantages of using Get-View instead of Get-VM, Get-VMHost and so on. If used correctly, there’s a major difference in speed when using Get-View over Get-VM.
When writing this post I checked the differences in speed when using the old way that I linked to above and my new function (which I’ll get to in a second or two..), the result was as follows:

As you can see, the difference is pretty clear. 5 seconds vs. 1.6 minutes…

So, without further ado, I present to you the code for Get-ISOMounts:

{
   [CmdletBinding()]
       Param (
           [switch]$Dismount
             )
       $VMs = Get-View -ViewType virtualmachine -Property name,Config.Hardware.Device
       $VMsWithISO = @()
       $progress = 1
       foreach ($VM in $VMs) {
           Write-Progress -Activity "Checking if VMs have ISOs mounted" -Status "Working on $($VM.name)" -PercentComplete ($progress/$VMs.count*100) -Id 1 -ErrorAction SilentlyContinue
           if (($VM | select -ExpandProperty config | select -ExpandProperty hardware | select -ExpandProperty device | select -ExpandProperty deviceinfo | where {$_.Summary -like "ISO*"}) -ne $NULL) {
               $object = New-Object PSObject
               Add-Member -InputObject $object NoteProperty VM $VM.Name
               Add-Member -InputObject $object NoteProperty "ISO mounted" (($VM | select -ExpandProperty config | select -ExpandProperty hardware | select -ExpandProperty device | select -ExpandProperty deviceinfo | where {$_.Summary -like "ISO*"}).Summary).Substring(4)
               $VMsWithISO += $object
               $object
           $progress++
           }
       }
       Write-Progress -Activity "Checking if VMs have ISOs mounted" -Status "All done" -Completed -Id 1 -ErrorAction SilentlyContinue

       if ($Dismount)
           {
           Write-Verbose "Starting to dismount ISOs"
           $progress = 1
           foreach ($VM in $VMsWithISO) {
               Write-Progress -Activity "Dismounting ISOs" -Status "Working on $($VM.name)" -PercentComplete ($progress/$VMsWithISO.count*100) -Id 1 -ErrorAction SilentlyContinue
               Get-CDDrive -VM $VM.Name | Set-CDDrive -NoMedia -Confirm:$False
               }
           Write-Progress -Activity "Dismounting ISOs" -Status "All done" -Completed -Id 1 -ErrorAction SilentlyContinue
           $progress++
           }

<#
.Synopsis
 Lists all VMs with ISOs mounted, can also dismount them
.Description
 Lists all VMs with ISOs mounted. If the switch -Dismount is present all mounted ISOs will be dismounted
.Example
 Get-ISOMounts
 Lists all mounted ISOs in the vCenter
.Example
 Get-Snapshots -Dismount
 Lists all mounted ISOs on VMs in the vCenter and then dismounts them
.Link
 http://cloud.kemta.net
#>
}

I feel the help section should speak for itself, but I’ll provide you a screenshot none the less. Just running Get-ISOMounts will provide you with an output looking like this: