正文为 html 的 Powershell 电子邮件发件人 (htmlbody.Replace)

Powershell email sender with html body (htmlbody.Replace)

我目前是一名 C# dotnet 自动化工程师。我的测试结果输出之一是通过电子邮件。我的测试结果输出通过 powershell。一般来说,我对电子邮件模板和 HTML 还很陌生。 这是一个简单的 HTML 主体,其中包含我用 $EmailBody= $EmailBody.Replace("PassedTests",$Passed) 函数等

替换的变量

整个前提:我的脚本用我在测试 运行 后从 .trx 文件中提取的数据替换了 Total tests/Passed/Failed/Skipped。 我的提取码:

            $PassedTests = $testResultsXml.TestRun.ResultSummary.Counters.Passed
            $FailedTests = $testResultsXml.TestRun.ResultSummary.Counters.Failed
            $SkippedTests = $testResultsXml.TestRun.ResultSummary.Counters.Skipped
            $OnlyFailed = $testResultsXml.TestRun.Results.UnitTestResult | Where-Object { $_.outcome -eq "Failed" }
            $FailedTestsName = $OnlyFailed.TestName

我有“错误列表”table(下图),如果 HTML 主体

中有任何失败的测试,它会显示测试名称
@</td>
</tr>
<!--end img-->

<tr>
<td height="15"></td>
</tr>

<!--title-->
<tr align="center">
<td align="center" style="font-family: 
'Open Sans', Arial, sans-serif; font-size:16px;color:#3b3b3b;font-weight: bold;">**ERROR LIST**</td>
</tr>
<!--end title-->

<tr>
<td height="10"></td>
</tr>

<!--content-->
<tr align="center">
<td align="center" style="font-family: 'Open Sans', Arial, sans-serif; font-size:12px;color:#7f8c8d;line-height: 24px;">NoErrors</td>
</tr>
<!--end content-->

</table>
</td>
</tr>
<tr>
<td height="30"></td>
</tr>
</table>

现在的主要问题是:是否有可能只显示“错误列表”table 仅当 有任何失败的测试时?如果没有失败的测试,那么 table 根本不显示会很好。 任何形式的帮助将不胜感激。谢谢!

$EmailBody= $EmailBody.Replace("PassedTests",$Passed)
$EmailBody= $EmailBody.Replace("FailedTests",$Failed)
$EmailBody= $EmailBody.Replace("SkippedTests",$Skipped)
$EmailBody= $EmailBody.Replace("ErrorList",$FailedTestsName)
$Emailattachment = "\TestResults.trx"

你走的路很好。 你只需要扩展你正在做的事情。

  • 删除电子邮件中可能存在或不存在的内容(“错误列表”部分,因为如果没有错误,它就不会存在)
  • 将您删除的部分放入其自己的变量中
  • 在主 html 模板中添加一个占位符(就像您已经做的那样,这样我们就可以在 html 模板中进行替换。

从那里开始,逻辑是:

  • 如果有 0 个错误,您将主模板中的占位符替换为空字符串(您不希望该占位符出现在最终电子邮件中)
  • 如果有 1 个或多个错误,您可以构建一个包含要追加的部分的新变量,而不是用您的错误列表替换,然后用错误内容替换它的循环,最后替换占位符通过该部分(包含错误循环)

看起来像这样。

$EmailBody = @'
</td>
</tr>
<!--end img-->

<tr>
<td height="15"></td>
</tr>

**ErrorsTable**

'@


$ErrorListBody = @'
<!--title-->
<tr align="center">
<td align="center" style="font-family: 
'Open Sans', Arial, sans-serif; font-size:16px;color:#3b3b3b;font-weight: bold;">**ERROR LIST**</td>
</tr>
<!--end title-->

<tr>
<td height="10"></td>
</tr>

<!--content-->
<tr align="center">
<td align="center" style="font-family: 'Open Sans', Arial, sans-serif; font-size:12px;color:#7f8c8d;line-height: 24px;">NoErrors</td>
</tr>
<!--end content-->

</table>
</td>
</tr>
<tr>
<td height="30"></td>
</tr>
</table>
'@


if ($FailedTests.Count -gt 0)  {
    # inserting errors to the `$ErrorListBody` html segment
    $ErrorsHtml = $ErrorListBody.Replace("ErrorList", $FailedTestsName)
    # inserting the html segment into the main email 
    $EmailBody = $EmailBody.Replace("**ErrorsTable**", $ErrorsHtml)
} else {
   # Removing the placeholder from the main template.
   $EmailBody = $EmailBody.Replace("**ErrorsTable**", '')
}