推荐使用 write-winevent 将错误写入 windows 事件查看器,因其支持自定义日志和结构化事件;若快速验证可直接用 write-eventlog 写入 application 日志,但需先以管理员权限注册事件源(如 new-eventlog -logname "application" -source "myscript")。
在 windows 中,powershell 脚本可以通过 write-eventlog 或更新的 write-winevent 命令,将错误信息写入 windows 事件查看器(event viewer)。推荐使用 write-winevent,因为它支持自定义日志和更规范的事件结构,且兼容 windows 7 及以上系统(需 powershell 3.0+)。
创建自定义事件源(首次运行前必须)
Windows 要求事件源(Source)必须在注册表中预先注册,否则 Write-EventLog 会失败;Write-WinEvent 则可直接写入已存在的日志(如 Application),但写入自定义日志时仍需注册。最稳妥做法是:
- 使用系统自带的
Application日志(无需注册源),适合快速验证 - 或提前用管理员权限注册一个自定义日志和源(推荐长期维护脚本时使用)
以管理员身份运行以下命令一次即可注册自定义源(例如叫 MyScript):
New-EventLog -LogName "Application" -Source "MyScript"
注意:-LogName "Application" 表示写入系统“应用程序”日志;若想新建专属日志(如 MyScripts),需用 New-EventLog 指定新日志名,并确保有管理员权限。
捕获错误并写入事件查看器
在脚本中用 try/catch 捕获异常,再调用写事件命令。关键点:
-
$_.Exception.Message获取错误消息主体 -
$_.Exception.StackTrace获取堆栈跟踪(便于调试) -
Write-EventLog简单易用,适合基础记录 -
Write-WinEvent更现代,支持结构化事件 ID 和任务类别
示例(写入 Application 日志,源为 MyScript):
try {
Get-Item "C:\NonExistent\File.txt" -ErrorAction Stop
} catch {
$msg = "脚本执行失败:$($_.Exception.Message)`n`n堆栈:$($_.Exception.StackTrace)"
Write-EventLog -LogName "Application" -Source "MyScript" -EntryType Error -EventId 1001 -Message $msg
}
使用 Write-WinEvent 写入更规范的事件
若需更好兼容性与扩展性(如后续对接监控工具),建议用 Write-WinEvent。它要求先定义事件日志路径和事件 XML 模板,但也可简化使用预定义日志:
- 直接写入
Application日志(无需模板):
$params = @{
LogName = 'Application'
Source = 'MyScript'
EventID = 1002
EntryType = 'Error'
Message = "PowerShell 错误:$($_.Exception.Message)"
}
Write-EventLog @params
- 若坚持用
Write-WinEvent,需先创建事件日志并注册提供程序(较复杂),日常运维中Write-EventLog已足够可靠
验证与排查常见问题
写入后,在“事件查看器 → Windows 日志 → 应用程序”中筛选来源为 MyScript 即可看到记录。若没出现:
- 确认脚本是否以管理员权限运行(注册源或写入某些日志需管理员)
- 检查
-Source名称是否与New-EventLog注册的一致(大小写不敏感,但必须完全匹配) - 确认
-LogName值正确(常用值:Application、System、Security;拼写错误会导致报错) - 避免在
catch块中再次出错(如变量未定义),可加Write-Host辅助调试











