PowerShell脚本问题:发送事件日志邮件仅显示System.Diagnostics.EventLogEntry(x15)
解决PowerShell邮件中事件日志内容显示异常的问题
这个问题的核心原因是你用Format-Table生成的不是纯文本内容——Format-*系列命令返回的是格式化输出对象(比如Microsoft.PowerShell.Commands.Internal.Format.FormatEntryData),当你把这类对象直接放进字符串"$event"时,PowerShell只会输出对象的类型名称,也就是你看到的System.Diagnostics.EventLogEntry (x 15)。
下面是两种可行的解决办法:
方法1:输出纯文本格式的日志表格
用Out-String将格式化后的表格转换成纯文本字符串,这样邮件就能正确显示表格内容:
# 获取日志并转换成纯文本表格 $event = Get-EventLog -LogName System -Source "Service Control Manager" -Newest 15 | Format-Table -AutoSize | Out-String # 发送邮件 Send-MailMessage -To "email@gmail.com" -From "script@gmail.com" -Body $event -Subject "Script log"
方法2:输出美观的HTML格式日志(推荐)
如果想让邮件内容更易读,可以用ConvertTo-Html生成HTML表格,再以HTML格式发送邮件:
# 获取日志并转换成HTML,指定要显示的字段 $eventHtml = Get-EventLog -LogName System -Source "Service Control Manager" -Newest 15 | ConvertTo-Html -Property TimeGenerated, EventID, Message ` -Title "Service Control Manager Latest Events" ` -PreContent "<h2>Latest 15 Service Control Manager System Events</h2>" # 发送HTML格式邮件(注意要加-BodyAsHtml参数) Send-MailMessage -To "email@gmail.com" -From "script@gmail.com" ` -Body ($eventHtml -join "`n") ` -Subject "Script log" ` -BodyAsHtml
额外说明
Format-Table这类命令是专门为控制台输出设计的,不要用它们来生成需要保存或发送的文本内容;- 用
ConvertTo-Html时,可以通过-Property参数指定你想展示的具体字段(比如TimeGenerated、EventID、Message),避免显示冗余信息; - 如果你的环境使用的是较新的PowerShell版本(5.1+或Core),也可以考虑用
Get-WinEvent替代Get-EventLog,它的输出更灵活,且是微软推荐的新命令。
内容的提问来源于stack exchange,提问作者RoyW
相关产品推荐
相关产品推荐

