You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 00:15:11