让 Windows 任务计划程序在失败时提醒我

让 Windows 任务计划程序在失败时提醒我

我有一个自动脚本,可以将网站备份提取到本地计算机。这个脚本可能会失败;一旦我的服务器宕机,我就会不小心移动我的脚本。

如何让 Windows 任务计划程序告诉我脚本失败(或未运行/未找到)?

我不在乎是否出现提示、电子邮件或桌面上出现的其他内容。我希望在出现问题时收到通知。在我的服务器上,crontab 会通过电子邮件向我发送错误信息 - 这很棒。我希望在我的 Windows 7 本地计算机上有类似的东西。

答案1

当计划任务启动失败时,事件会被写入任务调度器事件日志:

笔记:任务计划程序日志位于(管理工具下)

 Computer Management
    System Tools
       Event Viewer
          Application and Services Logs
             Microsoft
                Windows
                   Task Scheduler
                      Operational

在此处输入图片描述

Windows 可让您扳机当各种事件发生时启动的计划任务,例如:

  • 一天中的时间
  • 系统启动
  • 用户登录
  • 事件日志中记录的事件

有了这些知识,您可以创建一个在计划任务失败时运行的计划任务:

在此处输入图片描述

此计划任务的行动然后可以将其设置为向您发送警报的内容 - 以您选择的方法(例如触发关机)。您可能只希望它发送一封电子邮件:

在此处输入图片描述

这就是 Windows 处理一切的方式。您可以看到许多诊断任务在日志中出现事件时触发。例如,当检测到 IP 地址冲突时,会将事件写入日志:

  • 日志:系统
  • 来源:管道
  • 事件 ID:4198

计划任务会触发此事件,并运行程序来通知您并修复它。请记住,事件 ID 并不特定于一个任务。任何生成事件 203(操作启动失败)的任务都将触发此任务。

答案2

这是我的脚本,当我的备份作业的值大于 0 时会提醒我。

$ScheduledTaskName = "Hans\Backup"
$Result = (schtasks /query /FO LIST /V /TN $ScheduledTaskName  | findstr "Result")
$Result = $Result.substring(12)
$Code = $Result.trim()

If ($Code -gt 0) {
    $User = "[email protected]"
    $Pass = ConvertTo-SecureString -String "myPassword" -AsPlainText -Force
    $Cred = New-Object System.Management.Automation.PSCredential $User, $Pass
################################################################################

$From = "Alert Scheduled Task <[email protected]>"
$To = "Me Gmail <[email protected]>"
$Subject = "Scheduled task 'Backup' failed"
$Body = "Error code: $Code"
$SMTPServer = "smtp.gmail.com"
$SMTPPort = "587"

Send-MailMessage -From $From -to $To -Subject $Subject `
-Body $Body -SmtpServer $SMTPServer -port $SMTPPort -UseSsl `
-Credential $Cred
}

答案3

看一眼PushMon。您可以创建一个 PushMon URL,它将在脚本末尾被调用。如果您的脚本由于服务器关闭或脚本被移动而无法运行,您将收到通知。您可以通过电子邮件、短信、电话、即时通讯和 Twitter 收到通知。这适用于任何操作系统。这类似于 Pingdom,但适用于脚本和后台任务。

答案4

编辑:查看 Ian Boyd 的回答,然后当您开始使用电子邮件操作时,再回到这里。

自从 Ian Boyd 的原始答案发布以来,任务计划程序中的电子邮件操作已被弃用并最终被删除。但创建一个将发送 SMTP 电子邮件的 Powershell 脚本并运行它并不困难。以下是使用 Powershell 和的示例system.net.mail.smtpClient

$SmtpClient = new-object system.net.mail.smtpClient
$MailMessage = New-Object system.net.mail.mailmessage
$SmtpClient.Host = "mail.yourdomain.com"
$SmtpClient.Port = 587
#$SmtpClient.EnableSsl = $true
$SmtpClient.Credentials = New-Object System.Net.NetworkCredential( "[email protected]", "{pw}" );
$mailmessage.from = ("[email protected]")
$mailmessage.To.add("[email protected]")
$mailmessage.Subject = “Server Alert”
$mailmessage.Body = “Event 103 or 203 detected. This indicates a Scheduled Task has failed.”
$smtpclient.Send($mailmessage)

根据需要编辑详细信息(例如“mail.yourdomain.com”和凭证“[电子邮件保护]“和”{pw}“。您可能需要对Port和进行一些调整EnableSsl

将此脚本保存为FailedTaskAlert.ps1一个公共文件夹,例如C:\Users\Public\Documents

现在让我们将其连接到一个任务。

Action选项卡中使用Start a Program操作。在 中Program输入“powershell.exe”,然后在 中Add Arguments输入您的 ps1 文件,例如“C:\Users\Public\Documents\FailedTaskAlert.ps1”

我看到 Hans Folk 也在这样做,Send-MailMessage但我认为另一个 cmdlet 变体和有关如何将 Powershell 脚本连接到任务的操作的明确解释会对其他人有所帮助。

警告:请确保在任务计划程序的右侧操作面板中启用了所有任务历史记录,否则您将无法记录事件。如果您看到“历史记录”选项卡带有“已禁用”标签,则表明此功能已关闭。

相关内容