PowerShell: How to return all the VMs in a Hyper-V Cluster

57,671

Solution 1

These one liners maybe a little easier. Works for Windows Server 2012 R2, should work for 2012.

Get-VM –ComputerName (Get-ClusterNode –Cluster CLUSTER)

Basically gets the nodes from the cluster called "CLUSTER". Feeds list to your -ComputerName

OR

Get-ClusterGroup -Cluster CLUSTER | ? {$_.GroupType –eq 'VirtualMachine' } | Get-VM

Gets the cluster groups and filters for type called "VirtualMachine".

With either, you can execute Get-ClusterGroup instead of Get-ClusterGroup -Cluster CLUSTER if you are on one of the nodes.

Solution 2

I know this has been answered, but I like this one-liner better:

Get-VM -ClusterObject (Get-ClusterResource | where ResourceType -eq "Virtual Machine")

Or if you're doing it remote, reference the cluster:

Get-VM -ClusterObject (Get-ClusterResource -Cluster name-of-cluster | where ResourceType -eq "Virtual Machine")

The results can be piped into other commands, for example "Set-VMProcessor" or others.

Solution 3

You can also use Get-ClusterResource since a Cluster Virtual Machine Role is a Cluster Resource.

$clusterResource = Get-ClusterResource -Cluster SomeClusterName | Where ResourceType -eq "Virtual Machine"

Then Get-VM also has a -ClusterObject parameter

Get-VM -ClusterObject $clusterResource

From TechNet -

-ClusterObject Specifies the cluster resource or cluster group of the virtual machine to be retrieved.

https://technet.microsoft.com/en-us/library/hh848479.aspx

Share:
57,671
Paul S.
Author by

Paul S.

Updated on February 15, 2021

Comments

  • Paul S.
    Paul S. over 3 years

    I'm a first time programmer with PowerShell. Running on Windows Server 2012.

    I'm trying to get a list of all VM's on my failover cluster and am working with this:

    $clusterNodes = Get-ClusterNode | select Name 
    ForEach($item in $clusterNodes)
    {Get-VM -ComputerName $item}
    

    And this returns a bunch of errors

    However, this works perfectly fine

    $hosts = "server1", "server2", "server3", "server4"
    ForEach($item in $hosts)
    {Get-VM -ComputerName $item}
    

    Is it failing because Get-ClusterNode | select Name returns the following?

    Name
    ----
    server1
    server2
    server3
    server4
    

    with a heading and underline?