Powershell 获取Hyper-V群集Windows 2012 R2中的所有虚拟机及其磁盘大小

Powershell 获取Hyper-V群集Windows 2012 R2中的所有虚拟机及其磁盘大小,powershell,hyper-v,windows2012,Powershell,Hyper V,Windows2012,我正在尝试为集群中的所有虚拟机获取带有已设置磁盘大小的html报告。我试图列出集群内的所有虚拟机,包括: $VMs = get-ClusterGroup | ? {$_.GroupType -eq "VirtualMachine" } | Get-VM 这就像一个符咒。但是,当我尝试进行循环时: foreach ($VM in $VMs) { Get-VM -VMName $VM.Name | Select-Object VMId | Get-VHD } 当我运行此程序时,我得到了当前群集

我正在尝试为集群中的所有虚拟机获取带有已设置磁盘大小的html报告。我试图列出集群内的所有虚拟机,包括:

$VMs = get-ClusterGroup | ? {$_.GroupType -eq "VirtualMachine" } | Get-VM
这就像一个符咒。但是,当我尝试进行循环时:

foreach ($VM in $VMs)
{
 Get-VM -VMName $VM.Name | Select-Object VMId | Get-VHD
}
当我运行此程序时,我得到了当前群集节点上不存在的每个VM的错误信息。 因此,对于每个节点,我运行以下命令:

Get-VM -VMName * | Select-Object VMId | Get-VHD | ConvertTo-HTML -Proprerty path,computername,vhdtype,@{label='Size(GB)');expression={$_.filesize/1gb -as [int]}} > report.html
这也很有魅力。但这是登录集群中每个Hyper-V主机所必需的。
如何使集群中的所有虚拟机都能从一个节点以HTML格式输出?

类似的方法如何

$nodes = Get-ClusterNode
foreach($node in $nodes)
{
    $VMs=Get-VM -ComputerName $node.name
    foreach($VM in $VMs)
    {
        $VM.VMName
        Get-VHD -ComputerName $node.Name -VMId $VM.VMId | ft vhdtype,path -AutoSize
    }
}
据我所知;对于每个Get VHD调用,需要节点名为
-ComputerName
-VMId
。 由于某些原因,将Get VM传递给Get VHD不会提供节点名称

在您所寻找的内容中,上述内容并没有将结果作为要格式化的单个对象(html或其他)提供。 不过,有一个内联的
ForEach对象
可以实现这一点

这可能就是你想要的:

Get-VM -ComputerName (Get-ClusterNode) | 
ForEach-Object {Get-VHD -ComputerName $_.ComputerName -VMId $_.VMId} | 
ConvertTo-HTML -Property path,computername,vhdtype,@{label='Size(GB)';expression={$_.filesize/1gb -as [int]}} > report.html
在一行中:

Get-VM -ComputerName (Get-ClusterNode) | ForEach-Object {Get-VHD -ComputerName $_.ComputerName -VMId $_.VMId} | ConvertTo-HTML -Property path,computername,vhdtype,@{label='Size(GB)';expression={$_.filesize/1gb -as [int]}} > report.html
希望这能满足你的需要。享受吧