PowerCLI导出ESXi存储性能HTML报表去除重复表头方案咨询
解决方案
核心问题原因
重复表头是因为你的表头生成逻辑写在了遍历ESXi主机的循环内部,每处理一台主机就会生成一次表头。将采集逻辑和报表生成逻辑分离,先统一汇总所有性能数据再生成HTML即可解决该问题,同时该结构天然支持后续多Datastore、多VM的性能采集扩展。
优化实现步骤
步骤1:统一收集所有性能数据到数组
初始化空自定义对象数组,所有采集到的指标先存入数组,不要边采集边生成HTML片段。
# 初始化空数组存储全量性能数据 $allPerfData = @() # 遍历ESXi主机 foreach ($esxi in Get-VMHost) { # 提前适配多Datastore采集需求,遍历当前主机下所有Datastore foreach ($ds in Get-Datastore -VMHost $esxi) { # 原有性能指标采集逻辑 $perfStats = Get-Stat -Entity $ds -Stat "datastore.numberReadAveraged.average","datastore.numberWriteAveraged.average","datastore.totalReadLatency.average","datastore.totalWriteLatency.average","datastore.read.average","datastore.write.average" -MaxSamples 1 # 构造自定义对象存入全局数组 $entry = [PSCustomObject]@{ "ESXi主机名" = $esxi.Name "Datastore名称" = $ds.Name "ReadIOPS" = [math]::Round(($perfStats | Where-Object {$_.MetricId -eq "datastore.numberReadAveraged.average"}).Value,2) "WriteIOPS" = [math]::Round(($perfStats | Where-Object {$_.MetricId -eq "datastore.numberWriteAveraged.average"}).Value,2) "读延迟(ms)" = [math]::Round(($perfStats | Where-Object {$_.MetricId -eq "datastore.totalReadLatency.average"}).Value,2) "写延迟(ms)" = [math]::Round(($perfStats | Where-Object {$_.MetricId -eq "datastore.totalWriteLatency.average"}).Value,2) "读速率(MB/s)" = [math]::Round(($perfStats | Where-Object {$_.MetricId -eq "datastore.read.average"}).Value / 1KB,2) "写速率(MB/s)" = [math]::Round(($perfStats | Where-Object {$_.MetricId -eq "datastore.write.average"}).Value / 1KB,2) # 后续扩展VM性能采集时,直接在此处新增VM相关字段即可 } $allPerfData += $entry } }
步骤2:统一生成HTML报表(仅生成一次表头)
全量数据采集完成后调用ConvertTo-Html命令统一生成报表,自动生成唯一公共表头。
# 可选:自定义HTML样式优化显示效果 $htmlStyle = @" <style> body { font-family: 微软雅黑; font-size: 14px; } table { border-collapse: collapse; width: 100%; } th { background-color: #007ACC; color: white; padding: 8px; text-align: left; } td { border: 1px solid #ddd; padding: 8px; } tr:nth-child(even) { background-color: #f2f2f2; } </style> "@ # 统一生成HTML并导出,仅生成一次表头 $allPerfData | ConvertTo-Html -Head $htmlStyle -Title "vSphere性能采集报表" | Out-File -FilePath "vSphere_Perf_Report.html" -Encoding UTF8
扩展适配说明
- 后续新增VM性能采集需求时,仅需新增遍历VM的循环,构造自定义对象时补充VM相关字段存入
$allPerfData数组即可,HTML生成逻辑无需调整 - 如需区分不同资源类型,可在自定义对象中新增
资源类型字段做标记 - 如需做数据筛选,直接对
$allPerfData数组做过滤后再生成HTML即可
内容的提问来源于stack exchange,提问作者Empty Coder
相关产品推荐
相关产品推荐

