2017-09-11 88 views
0

我有一個Powershell腳本,其中有一部分需要通過電子郵件發送一些信息。我有要求在郵件正文中包含2條信息,但我遇到了格式問題。第一部分將是一行文本,我想簡單地將它作爲變量存儲在powershell腳本中,第二部分將是來自文本文件的信息。以下是我想要做的簡化版本:Powershell在電子郵件正文中使用字符串和文件內容而不會破壞格式化

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


" 
$INFO2=get-content "info2.txt" 
$BODY=$INFO1 + $INFO2 
$BODY=$BODY | out-string 
send-mailmessage -To [email protected] -Subject "Fruit Status" -From 
[email protected] -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」的文件中對同一段文本執行get-content獲得的。當我將這兩條信息附加到郵件正文中時,格式將保持不變,並且電子郵件看起來沒問題。

$INFO1=get-content "info1.txt" 
$INFO2=get-content "info2.txt" 
$BODY=$INFO1 + $INFO2 
$BODY=$BODY | out-string 
send-mailmessage -To [email protected] -Subject "Fruit Status" -From 
[email protected] -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只是-body而不是-bodyashtml,除非這是排序的唯一方法。

+0

我假設你的表格數據在$ INFO2中。你能分享一下,如果你運行一個寫主機,Info2的外觀如何?另外,你能否清楚地突出你的問題? – Dom

回答

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 [email protected] -Subject "Fruit Status" -From 
[email protected] -Body $BODY -Smtpserver smtp.mydomain.org -UseSsl 

獲取內容獲取的項目在指定的位置的內容,如文字 一份文件。默認情況下,PowerShell將一次讀取一行 的內容並返回一組System.String 對象。從原始文件 中刪除回車符(CR/LF),但是當PowerShell顯示字符串集合時,它將 重新插入回車符,以便顯示器看起來就像原始文件 一樣。

如果指定-raw,則會反轉此行爲,並且將立即讀取整個文件 。

+0

您的「問題」是由於此操作的LHS上的字符串「$ BODY = $ INFO1 + $ INFO2」。 '$ info2'被轉換爲一個字符串,並且數組被平鋪爲由空格分隔的字符串。通過使info2成爲單個字符串,它避免了這個問題。 'get-content「info2.txt」| Out-String或者'(get-content「info2.txt」)-join「'r'n」''也可以工作 – Matt

相關問題