PowerShell: How to return all the VMs in a Hyper-V Cluster
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
Paul S.
Updated on February 15, 2021Comments
-
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?