PowerShell:如何返回Hyper-V群集中的所有VM

时间:2014-01-28 15:07:10

标签: powershell windows-server-2012 hyper-v failovercluster

我是PowerShell的第一次程序员。在Windows Server 2012上运行。

我正在尝试获取故障转移群集上所有VM的列表并正在使用此功能:

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

这会返回一堆错误

然而,这完全正常

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

是否失败,因为Get-ClusterNode | select Name返回以下内容?

Name
----
server1
server2
server3
server4
带有标题和下划线的

7 个答案:

答案 0 :(得分:4)

试一试:

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

您必须引用Name返回的对象的Get-ClusterNode属性。

答案 1 :(得分:2)

这些衬垫可能更容易一些。适用于Windows Server 2012 R2,适用于2012年。

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

基本上从集群中获取名为“CLUSTER”的节点。 Feed列表到您的-ComputerName

OR

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

获取名为“VirtualMachine”的类型的群集组和过滤器。

如果您在其中一个节点上,则可以执行Get-ClusterGroup而不是Get-ClusterGroup -Cluster CLUSTER

答案 2 :(得分:1)

您也可以使用Get-ClusterResource,因为群集虚拟机角色是群集资源。

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

然后Get-VM也有一个-ClusterObject参数

Get-VM -ClusterObject $clusterResource

来自TechNet -

  

-ClusterObject   指定要检索的虚拟机的群集资源或群集组。

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

答案 3 :(得分:1)

我知道这已经得到了解答,但我更喜欢这种单行:

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

或者,如果您正在远程执行此操作,请参考群集:

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

结果可以通过管道传输到其他命令中,例如" Set-VMProcessor"或其他人。

答案 4 :(得分:0)

从对象中选择属性将显示标题。您可以通过将该列表连接到仅输出值的循环来解决此问题:

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

我没有专门测试你的代码,但我上周遇到了同样的问题。

答案 5 :(得分:0)

我认为最简单的方法是:

Get-VM -ComputerName VMCLUSTERNAME

这将返回群集中的所有VM。有时候需要使用域名全名 每个人都忘记了群集在域中作为具有角色Hyper-V的计算机可见。如果您将集群视为具有安装在其中的角色的普通计算机,您还可以访问集群中的其他角色。
(这在Server 2016中的powershell上运行得很完美)

答案 6 :(得分:0)

要从 SCVMM 集群获取 VM 列表,我们可以运行以下脚本,确保修改集群名称和 VMM 服务器名称以匹配您的:

$Cluster = Get-SCVMHostCluster -Name "hv19cluster" -VMMServer "vmm19n01"
$HostsInCluster = Get-SCVMHost -VMHostCluster $Cluster
#$HostsInCluster | Format-Table -Property Name, VirtualizationPlatform
ForEach ($h in $HostsInCluster) { 

$vm=Get-SCVirtualMachine -VMHost $h 
 
foreach($v in $vm){ write-host ($v)}

}