Send-MailMessage在由任务计划程序触发时缩短消息中的行并中断FullNames

时间:2018-03-25 07:04:40

标签: powershell scheduled-tasks sendmail

我无法找到电子邮件中的行被任务计划程序触发时缩短的原因(当脚本从ISE手动执行时,行不会缩短!)。我想将FullName传递给电子邮件,并将其用作文档的链接(当路径和文件不包含空格时,链接效果很好)。

End of lines are missing

如果我使用“format-list”而不是“format-table”它看起来更好(即使由Task Scheduler触发)我必须添加参数“$ body = $ newdoc | Out-String -Width 255”防止断行 - 但文件名中的空格仍然会断开链接:

enter image description here

接下来就是FullName包含空格 - 我尝试了很多方法(比如$ variable.replace; $ var = $ var -replace“”,“`”等等)

#date and time formating
$culture = Get-Culture
$culture.DateTimeFormat.LongTimePattern = 'HH:mm'
$culture.DateTimeFormat.ShortDatePattern = 'dd-MM-yyyy'
Set-Culture $culture

#find files changed during last hour, sort descending
$newdoc = get-childitem -File -Path \\ottm09itoms01\OTA-IT_Operators\ -Recurse | ? {$_.LastWriteTime -gt (Get-Date).AddHours(-1)} | sort lastwritetime -Descending | Format-table -Property LastWriteTime, fullname

$body = $newdoc | Out-String
$enc  = New-Object System.Text.utf8encoding
Send-MailMessage -From $sender -To $receiver2 -Subject "Documents updated" -body $body -Encoding $enc -SmtpServer $SMTPserver

1 个答案:

答案 0 :(得分:1)

经过一番挖掘后,我怀疑问题是您使用Out-String根据-width参数截断输出,该参数未指定。引用the documentation

  

-width
  指定每行输出中的字符数。任何其他字符都会被截断,而不会被包装。如果省略此参数,则宽度由主机程序的特征决定。 Windows PowerShell控制台的默认值为80(字符)。

换句话说,当您在ISE Out-String中运行此脚本时,可能会将宽度设置为ISE的缓冲区宽度,但是当任务计划程序运行它时,它使用默认的80个字符宽度。 / p>

所以基本上只需将-width 120(或您选择的值)添加到Out-String,看看是否能解决问题。

要修复空格上的链接,您可能需要使用-replace为它们手动生成一些HTML。类似的东西:

$body = $body -replace '(\\\\.*[^\s])','<a href="$1">$1</a>'
$body = $body.trim() -replace "`n","<br>`n"

这假设您的所有路径都是UNC路径(即以\\开头的路径)。然后,您需要在-BodyAsHtml命令上抛出Send-MailMessage。这是一种抛在一起的方式,我确信这可能是一种更好的做事方式,但它工作。