问题描述
我已经绞尽脑汁好几个小时了。我想要的只是以下内容。
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
还有 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)
}