windows可通过监听taskscheduler日志中event id 101/201/102事件,配合powershell脚本自动发邮件告警;需为每个id单独创建事件触发任务,脚本调用send-mailmessage发送详情,注意凭据安全与smtp配置。
要让 windows 在计划任务运行失败时自动发邮件提醒,核心思路是:**监听系统日志中的失败事件,再用 powershell 脚本捕获并发送邮件**。这不是任务本身的“失败回调”功能,而是通过事件触发机制实现的监控逻辑。
监听关键事件 ID
Windows 任务计划程序在执行出错时,会向 Microsoft-Windows-TaskScheduler/Operational 日志写入特定事件。最常见的是:
- Event ID 101:任务启动失败(如权限不足、路径错误、脚本不存在)
- Event ID 201:任务执行后返回非零退出码(即程序报错但进程未崩溃)
- Event ID 102:任务被手动终止或系统中断
你需要为每种失败类型单独建一个监控任务,因为一个触发器只能匹配一个 Event ID。
编写事件响应脚本
新建一个 PowerShell 脚本(如 C:ScriptsOnTaskFail.ps1),内容示例如下:
$event = Get-WinEvent -FilterHashtable @{LogName='Microsoft-Windows-TaskScheduler/Operational'; ID=101} -MaxEvents 1 -ErrorAction SilentlyContinue
if ($event) {
$taskName = ($event.Properties[0].Value -split '\')[-1]
$computer = $env:COMPUTERNAME
$time = $event.TimeCreated.ToString('yyyy-MM-dd HH:mm:ss')
$message = "任务 '$taskName' 在 $computer 于 $time 启动失败`n详情:$($event.Message)"
<pre class="brush:php;toolbar:false;">Send-MailMessage -From "alert@domain.com" `
-To "admin@domain.com" `
-Subject "⚠️ 任务调度失败:$taskName" `
-Body $message `
-SmtpServer "smtp.domain.com" `
-Port 587 `
-UseSsl `
-Credential (Get-Credential) # 建议改用加密凭据,见下文)}
注意:不要直接明文写密码。推荐用 Export-Clixml 加密保存凭证,再在脚本中导入;或使用 Windows 凭据管理器存储,通过 cmdkey + Get-StoredCredential(需安装模块)调用。
创建事件触发的任务
在“任务计划程序”中新建一个高级任务(不是基本任务),按以下配置:
- 常规:勾选“不管用户是否登录都要运行”,选择“最高权限”
-
触发器 → “新建” → 类型选“基于事件触发”,日志选
Microsoft-Windows-TaskScheduler/Operational,事件 ID 填101 -
操作 → “启动程序”,程序填
powershell.exe,参数填:-ExecutionPolicy Bypass -File "C:ScriptsOnTaskFail.ps1" - 条件:建议取消勾选“仅当计算机处于空闲状态时才启动此任务”,避免漏报
若需监控多个事件 ID(如 101 和 201),需分别建两个独立任务,共用同一脚本但修改过滤条件。
验证与调试要点
测试前先确认几项关键设置是否生效:
- 目标邮箱 SMTP 服务是否允许客户端发信(Gmail/Outlook 需开启“两步验证+应用专用密码”;国内邮箱如 QQ/163 需用授权码而非登录密码)
- 脚本路径无中文或空格,PowerShell 执行策略是否设为
RemoteSigned或Bypass(可通过Set-ExecutionPolicy RemoteSigned -Scope LocalMachine设置) - 任务属性中“配置”选项卡里,Windows 版本选对(如 Win10/Win11 选“Windows 10”或更高,否则某些事件可能不触发)
- 手动制造一次失败:建一个测试任务,操作设为运行
notexist.exe,运行后检查日志是否有 101 事件,并观察邮件是否发出











