首页 > 解决方案 > PowerShell 数组在使用 Send-MailMessage 时未在电子邮件中显示空格 ('n),而在使用 import-csv 时在顶部显示 *?

问题描述

我有一个正在运行的脚本,它根据在我们的环境中复制和保存的备份生成并通过电子邮件发送报告。我正在做的格式化此报告是创建一个正文数组以包含报告中显示的各种内容,并且为了格式化数据(服务器上备份的名称和 lastwritetime),我使用“选择名称,选择上次写入时间 | export-csv',然后在最后使用 ConverTo-Html -Fragment 将 import-csv 导入正文数组。这会适当地格式化所有数据:

$body = @()
"" | Out-File C:\files\PrimaryBody.csv -append

这里的代码抓住了备份问题

("The number of backups that were not successfully copied are " + $warningErrorCount + ". ") | Out-File C:\files\PrimaryBody.csv -append

$BackupIssues | Out-File C:\files\PrimaryBody.csv -append


$OutofDateBackups | select name, LastWriteTime | export-csv -path C:\files\OutDatedBackups.csv -append -Force  

$body+= " " 

$body+= "'n"

$body+= Import-Csv -Path C:\files\PrimaryBody.csv | ConvertTo-Html -Fragment


$body+= Import-Csv -Path C:\files\OutDatedBackups.csv | ConvertTo-Html -Fragment

运行 send-mailmessage 命令时,电子邮件中的结果如下:

*
The number of backups that were not successfully copied are 13. 
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

(我包含 X 只是为了掩盖数据:))

但是,我的问题在于正文数组不允许在电子邮件中显示空行/空格。我尝试了很多事情,包括$body += " ", $body+= "'n", $body+= "'r'n"它会做的就是要么完全忽略空格,要么直接写'n 在电子邮件的正文中。我不知道为什么它不允许我在电子邮件中添加空格/行。其次,无论我做什么,在import-csv中的数据写入之前,报告顶部总是有一个*报告。我不确定为什么会这样并且无法将其删除。如果可能,请帮助!

提前致谢 :)

标签: windowspowershellscripting

解决方案


您不应将数组用于 Send-MailMessage 的正文参数。如果您查看命令的帮助,您会看到参数是[[-Body] <string>]而不是[[-Body] <string[]>] 您的问题是您没有使用字符串参数。如果您将参数构建为字符串,然后使用换行符/返回字符,您会没事的。所以这会很好地工作:

$Body = "First line of text"
$Body += "`r`nSecond line of text"

在 PowerShell 中执行此操作的一种更有效的方法是使用 StringBuilder .NET 类。这是我喜欢的关于Powershell 主题的文章的链接:使用 StringBuilder 连接字符串。StringBuilder 比 += 添加到字符串要快。语法有点奇怪,但它会在你身上成长。StringBuilder 中的相同数据将是:

$sb = [System.Text.StringBuilder]::new()
[void]$sb.Append('First line of text')
[void]$sb.AppendLine('Second line of text')

要将数据用作字符串,您需要使用如下.ToString()方法:

$sb.ToString()

推荐阅读