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

g9icjywg  于 2023-01-26  发布在  Shell
关注(0)|答案(1)|浏览(261)

我正在尝试获取包含群集中所有虚拟机的预配磁盘大小的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输出与集群中的所有虚拟机从一个节点?

brgchamk

brgchamk1#

像这样的怎么样?

$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-Object可以做到这一点。
这也许是你正在寻找的:

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

希望这能满足你的需求,好好享受吧!

相关问题