PowerShell:如何返回Hyper-V集群中的所有虚拟机

7

我是一名首次使用PowerShell的程序员,运行在Windows Server 2012上。

我正在尝试获取故障转移群集上所有虚拟机的列表,并正在使用以下代码:

$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个回答

5

以下这些简短的命令可能更易于操作。适用于Windows Server 2012 R2,也可用于2012版本。

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

基本上从名为“CLUSTER”的集群中获取节点。将列表提供给您的-ComputerName参数。

或者

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

获取类型为“VirtualMachine”的群集组和筛选器。

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


4
试试这个方法:
$clusterNodes = Get-ClusterNode;
ForEach($item in $clusterNodes)
{Get-VM -ComputerName $item.Name; }

您需要引用由Get-ClusterNode返回的对象的Name属性。


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


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”或其他命令。

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)}

}

0
从对象中选择属性将显示标题。您可以通过将该列表传输到仅输出值的循环来解决此问题:
$clusterNodes = Get-ClusterNode | select Name | foreach {$_.Name}
ForEach($item in $clusterNodes)
{Get-VM -ComputerName $item}

我没有针对您的代码进行测试,但上周我遇到了同样的问题。


0

我认为最简单的方法是:

Get-VM -ComputerName VMCLUSTERNAME

这将返回您集群中的所有虚拟机。有时需要使用完整的域名。
大家都忘了集群在域中以 Hyper-V 角色的计算机形式可见。如果您将集群视为安装了其他角色的普通计算机,您也可以访问集群中的其他角色。
(这在 Server 2016 的 PowerShell 上运行得非常完美)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接