You can do something like this.
But note that the disk statistics are the aggregate, in other words the average over all datastores.
If you need this per datastore, you will need to use one or more of the datastore metrics (read and/or write).
If you can have varying numbers of datastore on each host, how do you intend to present this ?
Connect-VIServer <server> -User <user> -Password <password>
$allhosts = @()
$hosts = Get-VMHost
$start = (Get-Date).AddDays(-30)
$stat = 'cpu.usage.average','mem.usage.average','net.usage.average','disk.usage.average'
Get-Stat -Entity $hosts -Stat $stat -Start $start |
Group-Object -Property {$_.Entity.Name} | %{
$cpuStat = $_.Group | where{$_.MetricId -eq 'cpu.usage.average'} |
Measure-Object -Property value -Average -Maximum -Minimum
$memStat = $_.Group | where{$_.MetricId -eq 'mem.usage.average'} |
Measure-Object -Property value -Average -Maximum -Minimum
$netStat = $_.Group | where{$_.MetricId -eq 'net.usage.average' -and $_.Instance -eq ''} |
Measure-Object -Property value -Average -Maximum -Minimum
$diskStat = $_.Group | where{$_.MetricId -eq 'disk.usage.average' -and $_.Instance -eq ''} |
Measure-Object -Property value -Average -Maximum -Minimum
[pscustomobject]@{
HostName = $_.Group[0].Entity.Name
CPUAvg = $cpuStat.Average
CPUMin = $cpuStat.Minimum
CPUMax = $cpuStat.Maximum
MemAvg = $cpuStat.Average
MemMin = $cpuStat.Minimum
MemMax = $cpuStat.Maximum
NetAvg = $cpuStat.Average
NetMin = $cpuStat.Minimum
NetMax = $cpuStat.Maximum
DiskAvg = $cpuStat.Average
DiskMin = $cpuStat.Minimum
DiskMax = $cpuStat.Maximum
}
}