PowerShell生成HTML报告:按利用率条件设置行颜色问题求助
解决PowerShell生成HTML存储报告时行颜色不生效问题
问题分析
你的代码只修改第一行颜色的核心原因:
- 循环内重复导入CSV并生成HTML,每次循环都会覆盖
$bodyB,最终仅保留最后一次循环结果,逻辑冗余且错误。 - 使用
-OutVariable ag获取的是整个CSV对象集合,在foreach中判断$ag.Utilized -gt 90时,PowerShell会默认取集合第一个元素的值作为判断依据,导致所有行都套用第一行的颜色规则。
修正后的完整代码
# 替换为你的实际路径 $TPATH = "你的TPATH路径" $PATH = "你的PATH路径" # 1. 处理agg.csv生成规范的aggregate.csv # 写入CSV表头 $header = "Aggregate,Size,Available,Used,Utilized,State" $header | Out-File "$TPATH\aggregate.csv" -Encoding UTF8 # 读取并转换agg.csv数据 Get-Content "$TPATH\agg.csv" | ForEach-Object { $fields = $_.Split(",", 10) $utilized = $fields[2].TrimEnd('%') # 移除百分号,转为纯数字 # 按指定顺序构造数据行 "$($fields[0]),$($fields[3]),$($fields[1]),$($fields[5]),$utilized,$($fields[4])" } | Out-File "$TPATH\aggregate.csv" -Encoding UTF8 -Append # 2. 生成带行颜色的HTML报告 $aggData = Import-Csv "$TPATH\aggregate.csv" # 生成基础HTML片段 $htmlFragment = $aggData | ConvertTo-Html -Fragment -Property Aggregate,Size,Available,Used,Utilized,State # 为每一行设置对应背景色 $coloredHtml = $htmlFragment | ForEach-Object -Begin { $rowIndex = 0 } -Process { if ($_ -match '<tr>') { if ($rowIndex -eq 0) { # 表头行保持原样式 $_ } else { # 匹配对应数据行的利用率,设置颜色 $utilizedValue = [int]$aggData[$rowIndex - 1].Utilized $bgColor = $utilizedValue -gt 90 ? '#FE0808' : '#E5FCA1' $_ -replace '<tr>', "<tr bgcolor=`"$bgColor`">" } $rowIndex++ } else { # 非<tr>标签的内容直接返回 $_ } } # 生成完整HTML文件 ConvertTo-Html -Body "<br>$($coloredHtml -join "`n")" | Out-File "$PATH\Netapp.html" -Encoding UTF8
关键改进点
- 一次性处理CSV:避免循环内重复读写文件,提升效率并保证数据完整性。
- 行数据与HTML标签绑定:通过索引将每一行HTML与CSV中的具体对象对应,确保每一行都能根据自身利用率值判断颜色。
- 表头单独处理:保留表头默认样式,仅为数据行设置背景色。
内容的提问来源于stack exchange,提问作者Faizal Izham
相关产品推荐
相关产品推荐

