VMware Cloud Community
AutomationStat1
Contributor
Contributor
Jump to solution

Finding all VMs with CDROMs and disconnecting them

The script below gathers all VMs and disconnects the CDROM if its found to be connected:

$VMs = Get-VM

$CDConnected = Get-CDDrive $VMs
| where { ($_.ConnectionState.Connected -eq "true") -and ($_.ISOPath -notlike "*.ISO*")}

If ($CDConnected -ne
$null) {Set-CDDrive -connected 0 -StartConnected 0 $CDConnected -Confirm:$false }

How would you put this into a Foreach statement to gather all VMs in all Datacenters in all clusters and dismount/disconnect the CDROM if its found?

0 Kudos
1 Solution

Accepted Solutions
LucD
Leadership
Leadership
Jump to solution

Something like this for example

foreach($VM in Get-VM){

    $CDConnected = Get-CDDrive $VM |

    where { ($_.ConnectionState.Connected -eq "true") -and ($_.ISOPath -notlike "*.ISO*")}

    If ($CDConnected -ne $null) {

        Set-CDDrive -CD $CDConnected -connected $false -StartConnected 0 -Confirm:$false

    }

}


Blog: lucd.info  Twitter: @LucD22  Co-author PowerCLI Reference

View solution in original post

0 Kudos
3 Replies
LucD
Leadership
Leadership
Jump to solution

Something like this for example

foreach($VM in Get-VM){

    $CDConnected = Get-CDDrive $VM |

    where { ($_.ConnectionState.Connected -eq "true") -and ($_.ISOPath -notlike "*.ISO*")}

    If ($CDConnected -ne $null) {

        Set-CDDrive -CD $CDConnected -connected $false -StartConnected 0 -Confirm:$false

    }

}


Blog: lucd.info  Twitter: @LucD22  Co-author PowerCLI Reference

0 Kudos
AutomationStat1
Contributor
Contributor
Jump to solution

Thank you! This worked with one datacenter, but will it work with multiple datacenters or do i need to nest a foreach statement with something like:

ForEach ($dc in Get-Datacenter){$dc | {$cluster in Get-Cluster...

foreach($VM in Get-VM){

    $CDConnected = Get-CDDrive $VM |

    where { ($_.ConnectionState.Connected -eq "true")}

If ($CDConnected -ne $null) {

        Set-CDDrive -CD $CDConnected -connected $false -StartConnected 0 -Confirm:$false

    }

Or is the one foreach statement sufficient? I dont have the resources to test multiple datacenters at the moment

0 Kudos
LucD
Leadership
Leadership
Jump to solution

If these Datacenters are all in the vCenter to which you are connected (check the content of $global:defaultviserver), you don't need the extra foreach loop.

The Get-VM will return all VMs in that vCenter, independent of which Datacenter they are in.le

If you have multiple vCenters, if you connect to all of them (check $global:defaultviservers), you still would only need the single foreach loop with the Get-VM.


Blog: lucd.info  Twitter: @LucD22  Co-author PowerCLI Reference

0 Kudos