PowerShell数组在使用Send-MailMessage时不显示电子邮件中的空格('n),而在使用import-csv时在顶部显示*。

问题描述 投票:1回答:2

我正在运行一个脚本,该脚本根据在我们环境中复制并保存的备份生成并通过电子邮件发送报告。我要格式化此报告的方法是创建一个正文数组,以包括报告中显示的各种内容,并且为了格式化数据(服务器上备份的名称和备份的最后写入时间),我使用“选择名称,选择lastwritetime |导出csv”,然后使用ConverTo-Html -Fragment在末尾导入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中的数据之前,总是在报告顶部显示一个*,如上所述。我不确定为什么会这样,并且无法将其删除。请帮助,如果可能!

提前感谢:)

windows powershell scripting
2个回答
1
投票

您正在使用部分正文作为html。然后,不要使用数组,而将<br />标签用作换行符。像这样:

$body = "First line"
$body += "<br />"

并且在发送邮件时,使用-BodyAsHtml开关参数。


0
投票

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

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

在PowerShell中更有效的方法是使用StringBuilder .NET类。这是指向我喜欢的关于此主题Powershell: Concatenate strings using 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()

我希望这对您有所帮助。如果是这样,请在左上角接受并投票。

© www.soinside.com 2019 - 2024. All rights reserved.