PowerShell中ForEach循环生成表格时值输出异常求助
问题原因
你这段代码的核心问题出在生成报表的嵌套循环里:对每个监控名称($executedMonitor),你又把所有$Values遍历了一遍,每次都给$Results.Status赋值,最后自然只剩最后一个$Value的passFail结果,所以所有行的Status都是同一个值。
解决方法
因为$executedMonitors和$Values是一一对应的同长度列表,直接按索引关联两者就行,不用嵌套循环。下面是修正后的完整代码:
# 读取并解析JSON文件 $json = Get-Content $OutputJsonFile -Raw | ConvertFrom-Json # 获取监控名称列表 $executedMonitors = $json.result.data.dimensionMap."dt.entity.synthetic_test.name" # 获取数值列表 $Values = $json.result.data.values Write-Host "原始数值: " $Values # 给每个数值添加passFail属性 $condition = 1 # 改成数字类型,避免字符串比较的潜在问题 foreach ($value in $Values) { $passFail = if ($value -ge $condition) { "PASS" } else { "FAIL" } $value | Add-Member -NotePropertyName passFail -NotePropertyValue $passFail -Force } Write-Host "添加状态后的数值: " $Values.passFail # 生成关联报表(按索引一一对应) $Report = for ($i = 0; $i -lt $executedMonitors.Count; $i++) { [PSCustomObject]@{ Application = $executedMonitors[$i] Status = $Values[$i].passFail } } # 输出表格验证 $Report | Format-Table -AutoSize # 转换为HTML(用于邮件内容) $htmlReport = $Report | ConvertTo-Html -Title "监控状态报表" -PreContent "<h2>合成监控执行状态</h2>" # 自定义HTML样式优化显示(可选) $htmlReport = $htmlReport -replace "<table>", "<table border='1' cellpadding='4' cellspacing='0'>"
关键改动说明
- 把嵌套的
foreach循环改成了for索引循环,直接通过$i取对应位置的监控名称和状态值,确保一一对应 - 把
$condition从字符串'1'改成数字1,避免字符串与数字比较时的意外逻辑错误 - 用
[PSCustomObject]直接创建对象,比SELECT语法更简洁直观 - 增加了转HTML的代码,并添加基础样式优化邮件显示效果
内容的提问来源于stack exchange,提问作者JCoder92
相关产品推荐
相关产品推荐

