У планувальнику завдань Windows (Task Scheduler) можливо запускати завдання як за розкладом, так і при появі в журналі певної події (описувалося у статті "Тригери подій в Windows"). У цій статті ми розберемося як реалізувати механізм, який реалізує автоматичний запуск завдання планувальника по завершенню іншого завдання. Розглянемо спрощений алгоритм настройки залежностей запуску завдань планувальника, який ви зможете адаптувати під свою задачу.
У моєму випадку потрібно було після завершення одного скрипта запустити інший скрипт з-під іншого користувача. Тому ці дії не можна було об'єднати в рамках одного завдання.
Припустимо, нам потрібно запустити завдання планувальника Pong по завершенню завдання Ping. При запуску і закінчення будь-якого завдання в журнал системи заноситься інформація про цю подію. Ми якраз і будемо орієнтуватися на появу події завершення завдання Ping.
відкриємо консоль Task Scheduler (Taskschd.msc), знайдемо і виберемо подія Ping і в нижній панелі перейдемо на вкладку History, що містить інформацію про всі події, пов'язані з даним завданням. Нас цікавить подія з кодом 102 (Task completed) - яке генерується після завершення завдання.
Відкриємо докладний опис події, перейшовши на вкладку Detail і перемкнемося в XML режим подання події (XML View). За XML даними можна отримати всі деталі події, які нам знадобляться для побудови фільтра. Зокрема, нас цікавлять:
EventID: 102
Provider-Name: Microsoft-Windows-TaskScheduler
Channel: Microsoft-Windows-TaskScheduler / Operational
TaskName: \ ping
При створенні тригера для завдання Pong ми повинні створити умова спрацьовування завдання при появі в журналі події 102 (Тригер завдання On an event). Але проблема в тому, що EventID 102 з'являється при завершенні виконання будь-якого завдання, а не тільки завдання Ping.
Однак, є можливість створити більш гнучке умови для вибору подій (Custom), Коли стандартний фільтр не допомагає досить чітко вибрати подія. Натисніть на кнопку New Event Filter:
Створимо новий фільтр подій, вказавши раніше отримані дані з XML подання події.
Events Logs: Microsoft-Windows-TaskScheduler / Operational
Event source: TaskScheduler
Task category: Task completed
Потім переходимо на вкладку XML і бачимо таке XML уявлення фільтра (XPath):
* [System [Provider [@ Name = 'Microsoft-Windows-TaskScheduler'] and Task = 102]]
Замінимо код Xpath на наступний, фільтруючий журнал на наявність події TaskCompleted від завдання \ ping:
* [System [Provider [@ Name = 'Microsoft-Windows-TaskScheduler'] and Task = 102]]
Після додавання цієї події спробуйте запустити завдання ping. По його завершенню повинна негайно запуститися завдання pong.
Розшифровка XPath представлена нижче.
Стаття написана за матеріалами публікації Running a Scheduled Task after another (Http://blogs.msdn.com/b/davethompson/archive/2011/10/25/running-a-scheduled-task-after-another.aspx)