Powershell - 邮件消息正文不会换行 System.IO.File 选项获取内容 -Raw

问题描述

我已经绞尽脑汁好几个小时了。我想要的只是以下内容

202011.txt

3   12/28/2020 4:22:56.008 PM   Front                   MOTION
10  12/28/2020 4:23:02.619 PM   Joessomebody            ::ffff:10.60.0.169: Login
3   12/28/2020 4:23:30.610 PM   Front                   MOTION
3   12/28/2020 4:24:05.131 PM   Front                   MOTION

它在电子邮件中一直看起来像这样

3 12/28/2020 4:22:56.008 PM 10 12/28/2020 4:23:02.619 PM Joessomebody ::ffff:10.60.0.169:登录 3 12/28/2020 4:23:30.610 PM 3 12/28/2020 4:24:05.131 PM 前运动

$SmtpClient = new-object system.net.mail.smtpClient

$MailMessage = New-Object system.net.mail.mailmessage

$SmtpClient.Host = "campus.Test.com"

$mailmessage.from = ("No-Reply@Test.org")

$mailmessage.To.add("Me@Test.org")

function Get-LastLinesNew
{
$v = Get-Content -Path "C:\BlueIris\log\202011.txt" -Tail 5
return ($v)
}
$mailmessage.Subject = “Alert - NVR - Blue Iris - Logs”

<#$mailmessage.Body = “Alert Body with Instruction to recipients”#>

$file = "C:\BlueIris\log\202011.txt"

$attach = Get-LastLinesNew
$attach = $attach -replace "'r'n","<br />"
$MailMessage.IsBodyHtml = $true
$attach    #For Testing 
$MailMessage.body = $attach -replace "'r'n","<br />"
$MailMessage.body #For Testing
pause   #For Testing

try
{
    $smtpclient.Send($mailmessage)
}
catch [System.Management.Automation.MethodInvocationException] 
{
    $MailMessage.Attachments.dispose()
    $MailMessage.Body = "File Size to large,ERROR"
    $MailMessage.Subject = "NVR ERROR"
    $smtpclient.Send($MailMessage)

}

我只是将功能精简到最低限度,但它仍然失败

$MailMessage = New-Object system.net.mail.mailmessage
$attach = Get-Content -Path "\\NVR\c$\BlueIris\log\202011.txt" -Tail 5
$attach = $attach -replace "'r'n","<br />"
$MailMessage.IsBodyHtml = $True
$attach
$MailMessage.body = $attach
$MailMessage.body
pause

REsult

还有 Psversion 5.1.19041.610

解决方法

最后,我需要将 Out-String 作为管道命令添加到 Get-Content

function Get-LastLinesNew
{
$v = Get-Content -Path "C:\BlueIris\log\202011.txt" -Tail 5 | Out-String
return ($v)
}

就这样,它就像做梦一样。我猜想 powershell shell 内置了某种自动格式,允许它在使用替换命令时将所有字符串显示为一个字符串,然后将其显示在屏幕上。一旦它转到邮件消息,它就会再次将其作为数组读取并丢失所有格式。奇怪但解决了。谢谢大家!!!!

,

其他几个选项是对 Get-Content 使用 [System.IO.File]-raw 标志,因为 Get-Content 返回一个行数组。

System.IO.File 选项

function Get-LastLinesNew
{
  $v = [System.IO.File]::ReadAllText("C:\BlueIris\log\202011.txt")
  return ($v)
}

获取内容 -Raw

function Get-LastLinesNew
{
  $v = Get-Content -Path "C:\BlueIris\log\202011.txt" -Raw
  return ($v)
}