Send-MailMessage任务计划触发时换行缩短及FullName链接问题求助
解决Task Scheduler触发PowerShell脚本时Send-MailMessage内容截断与文档链接问题
我之前也踩过一模一样的坑!当用Task Scheduler触发脚本时,Send-MailMessage发的邮件内容总是莫名其妙被截断换行,但手动在ISE里跑就完全正常,这本质是非交互式环境和交互式环境的默认输出宽度差异搞的鬼。下面给你拆解问题和解决办法:
一、内容截断的核心原因
ISE或者你手动打开的PowerShell控制台,默认输出宽度会跟着窗口大小走,一般都比较宽;但Task Scheduler触发的脚本是在非交互式的后台环境运行的,默认输出宽度只有80字符左右。这时候用Format-Table格式化输出,PowerShell会自动把内容砍短来适配这个窄宽度,自然就出现了换行缩短的问题。
二、彻底解决内容截断的方案
直接把Format-Table换成Format-List是第一步——列表格式本身就不会像表格那样受宽度限制,展示效果也更清晰。但关键是要加上Out-String -Width 255(可以根据你的需求调整宽度值),强制指定输出的字符宽度,从根源上避免截断:
# 假设$newdoc是你要输出的文档对象集合 $body = $newdoc | Format-List | Out-String -Width 255 # 然后调用Send-MailMessage发送 Send-MailMessage -To "收件人邮箱" -From "发件人邮箱" -Subject "新文档通知" -Body $body -SmtpServer "你的SMTP服务器地址"
要是你的FullName特别长,把-Width设成500甚至1000都没问题,只要能覆盖最长的路径就行。
三、FullName作为可点击文档链接的处理
当路径或文件名带空格时,直接用FullName当链接会失效,这时候需要把它转成标准的file://格式,同时转义空格为%20:
# 给每个文档对象添加可点击的链接属性 $newdoc = $newdoc | ForEach-Object { # 转义空格并生成file://链接 $escapedPath = $_.FullName -replace ' ', '%20' $fileLink = "file:///$escapedPath" # 添加一个新的属性存HTML链接 $_ | Add-Member -MemberType NoteProperty -Name "可打开链接" -Value "<a href=`"$fileLink`">$($_.FullName)</a>" -Force return $_ } # 注意:发送HTML邮件要加上-BodyAsHtml $true $body = $newdoc | Format-List 可打开链接, 其他你需要的属性 | Out-String -Width 255 Send-MailMessage -To "收件人邮箱" -From "发件人邮箱" -Subject "新文档通知" -Body $body -BodyAsHtml $true -SmtpServer "你的SMTP服务器地址"
要是不想用HTML邮件,也可以直接把转义后的file://路径放在邮件里,用户复制到资源管理器或者浏览器里一样能打开对应的文件。
内容的提问来源于stack exchange,提问作者Josef B.
相关产品推荐
相关产品推荐

