В планировщике заданий 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):
<QueryList>
<Query Id="0" Path="Microsoft-Windows-TaskScheduler/Operational">
<Select Path="Microsoft-Windows-TaskScheduler/Operational">*[System[Provider[@Name='Microsoft-Windows-TaskScheduler'] and Task = 102]]</Select>
</Query>
</QueryList>
Заменим код Xpath на следующий, фильтрующий журнал на наличие события TaskCompleted от задания \ping:
<QueryList>
<Query Id="0" Path="Microsoft-Windows-TaskScheduler/Operational">
<Select Path="Microsoft-Windows-TaskScheduler/Operational">*[System[Provider[@Name='Microsoft-Windows-TaskScheduler'] and Task = 102]]</Select>
</Query>
</QueryList>
После добавления этого события попробуйте запустить задание 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)
забыли :
*[EventData [@Name='TaskSuccessEvent'][Data[@Name='TaskName']='\Ping']]
Спасибо, поправил — почему то XML код не тот скопировал.
Переписать «своими словами» конечно хорошо, но статьи, мне кажется, перестали быть идентичными.
не описали что необходимо указать на первой закладке (от имени кого запускаться и т.д.), для того, чтоб пользователь вошедший в систему видел (визульно) например запущенное приложение. И еще ситуация : если пользователей на ПК может заходить несколько, тогда для каждого пользователя делать такое задание или можно обойтись одним?
1) Это как раз-таки не всегда нужно, чтобы пользователь что-то видел.
2) Вы можете запускать любое задание в независимости от того, залогинен ли определенный пользователь или нет — в настройках задания есть соотвествующие опции
Отличная статья. То, что искал. Но есть пару вопросов.
Мне нужно задать выполнение задания Х в определённое время и только после успешного выполнения трех других заданий.
Как создать такие условие?
К моему предыдущему сообщению.
В принципе, я догадался сам, как это организовать ( задать выполнение задания Х в определённое время и только после успешного выполнения трех других заданий). Запуск самого первого задания я настроил в нужное мне время. Выполнение трёх остальных я задал последовательно, в зависимости от успешного выполнения каждого предыдущего задания. Не знаю, насколько это простая схема. Жаль, что нельзя настроить выполнение задания при соблюдении условий нескольких триггеров.
Ну в общем-то все правильно, если не использовать дополнительных надстроек так должно заработать. Можно, управлять параметрами задания из других заданий, либо использовать какой-нибудь текстовый файл или ключ реестра для передачи состояния между заданиями. В общем-то все зависит от потребностей и формилировки задачи.
Добрый день.
Подскажите, пожалуйста, конечный XML должен выглядеть вот так:
* [EventData[@Name='TaskSuccessEven'][Data[@Name='TaskName']='\insta_grab1']]
Как-то криво прикрепилось…
Вот принтскрин — http://prntscr.com/lasub7
* [EventData[@Name=’TaskSuccessEven’][Data[@Name=’TaskName’]=’\insta_grab1′]]
У меня просто не взлетело, вот думаю, я что-то не так написал или ?
А если в одном задании запускать две программы — они запускаются поочередно? Сначала первая до конца. потом вторая, без относительно результата выполнения первой, но лишь после ее полного завершения?
Полный XML код:
*[EventData
[@Name='TaskSuccessEvent'][Data[@Name='TaskName']='\insta_grab1']]
Если вам нужно последовательно запустить две программы, просто обьедините их вызов (или код) в одном скрипте (bat или powershell).
Здравствуйте!
Спасибо за хорошую статью!
Есть такой вопрос:
как предотвратить запуск следующего задания, если предыдущее было завершено пользователем из планировщика (код события 330) ?
я попробовал так (через минус события):
*[EventData[@Name=’StoppedOnRequest’][Data[@Name=’TaskName’]=’\имя_задачи’]]
но следующая задача всё равно запускается (
*[EventData[@Name='StoppedOnRequest'][Data[@Name='TaskName']='\Trol\PostgreSQL 1C bases backup\ACC_C_30_GK']]
в комментах подавляются xml теги:
__*[EventData[@Name=’StoppedOnRequest’][Data[@Name=’TaskName’]=’\Trol\PostgreSQL 1C bases backup\ACC_C_30_GK’]]__
«*[EventData[@Name=’StoppedOnRequest’][Data[@Name=’TaskName’]=’\Trol\PostgreSQL 1C bases backup\ACC_C_30_GK’]]«
ЖЭСТЬ ((
_начало_тэга_Suppress Path=»Microsoft-Windows-TaskScheduler/Operational»_конец_тэга_*[EventData[@Name=’StoppedOnRequest’][Data[@Name=’TaskName’]=’\Trol\PostgreSQL 1C bases backup\ACC_C_30_GK’]]_начало_тэга_/Suppress_конец_тэга_
Не срабатывает.
Задача: После запуска приложения «А» запускать приложение «Б» и повторять каждый час.
Не срабатывает триггер по событию? или о чем вы?
Не выполняется действие, я поставил в триггер программу (По событию — журнал: Application) которую запускаю вручную, нужно чтоб через час и каждый час запускалась программа во вкладке действие.
Не выполняется действие, я поставил в триггер программу (По событию — журнал: Application) которую запускаю вручную, нужно чтоб через час и каждый час запускалась программа во вкладке действие.