Powershell使用电子邮件正文中的字符串和文件内容而不会破坏格式

时间:2017-09-11 22:19:19

标签: powershell

我有一个Powershell脚本,其中有一部分需要通过电子邮件发送一些信息。我要求在邮件正文中包含2条信息,但我遇到格式化问题。第一部分是一行文本,我想简单地将其作为变量存储在powershell脚本中,第二部分将是来自文本文件的信息。以下是我想要做的简化版本:

$INFO1="The following fruits are ready to eat:


"
$INFO2=get-content "info2.txt"
$BODY=$INFO1 + $INFO2
$BODY=$BODY | out-string
send-mailmessage -To myname@mydomain.com -Subject "Fruit Status" -From 
fruit@mydomain.com -Body $BODY -Smtpserver smtp.mydomain.org -UseSsl

文件info2.txt包含以下信息。 3列,带有制表符分隔符的水果列表:

Col1        Col2        Col3
Apple       Orange      Pear
Banana      Grape       Strawbery
Kiwi        Peach       Apricot

以上代码有效但我收到的电子邮件如下:

The following fruits are ready to eat:


Col1        Col2        Col3 Apple      Orange      Pear Banana     Grape       
Strawbery Kiwi      Peach       Apricot

它将行间隔保留在$ INFO1存储的变量字符串中,但随后将info2.txt文件的内容全部放在一行中,没有换行符或标签格式。

我通过以下更改对此进行了测试,其中来自$ INFO1变量的文本行是通过在名为" info1.txt&#34的文件内对同一段文本执行get-content来获得的。 ;。然后,当我将两条信息附加到邮件正文中时,格式化得以维护,电子邮件看起来还不错。

$INFO1=get-content "info1.txt" 
$INFO2=get-content "info2.txt"
$BODY=$INFO1 + $INFO2
$BODY=$BODY | out-string
send-mailmessage -To myname@mydomain.com -Subject "Fruit Status" -From 
fruit@mydomain.com -Body $BODY -Smtpserver smtp.mydomain.org -UseSsl



The following fruits are ready to eat:


Col1        Col2        Col3 
Apple       Orange      Pear 
Banana      Grape       Strawbery 
Kiwi        Peach       Apricot*

我还注意到,如果我使用第一种方法执行以下操作,首先抓取文件内容,然后从变量中获取字符串,格式也保持正常:

$BODY=$INFO2 + $INFO1

只有当我首先从变量开始使用字符串时,它才会破坏电子邮件中文件内容部分的格式。

我更希望保持脚本更紧凑,并最大限度地减少写入磁盘上的文件和使用存储的变量。有没有办法可以使用方法1附加一个字符串或多个字符串,然后是保存格式的文件内容?我不希望使用HTML,因为它会使我正在使用的文本文件内容过于复杂,因此正文只是-body而不是-bodyashtml,除非这是对此进行排序的唯一方法。

1 个答案:

答案 0 :(得分:0)

我相信我找到了答案。之前我使用了get-content -RAW参数,但我认为我在使用它来获取存储在管道中的内容时遇到了麻烦。当我在没有其他where子句的文件上直接使用它时,它解决了问题:

$INFO1="The following fruits are ready to eat:


"
$INFO2=get-content "info2.txt" -raw
$BODY=$INFO1 + $INFO2
$BODY=$BODY | out-string
send-mailmessage -To myname@mydomain.com -Subject "Fruit Status" -From 
fruit@mydomain.com -Body $BODY -Smtpserver smtp.mydomain.org -UseSsl
  

Get-Content获取指定位置的项目内容,   例如文件中的文本。默认情况下,PowerShell会读取   一次内容一行并返回System.String的集合   对象。从原始文件中删除回车符(CR / LF)   但是当PowerShell显示字符串集合时,它会   重新插入回车符,以便显示看起来就像   原始文件。

     

如果指定-raw,则此行为将颠倒整个文件   将立即阅读。