Как создать задачу в планировщике задач в windows 10 powershell

Обновлено: 07.07.2024

Описание процедур создания запланированных заданий и управления ими.

Подробное описание

В этом документе показано, как выполнять базовые задачи по созданию запланированных заданий и управлению ими. Дополнительные сведения о более сложных задачах см. в разделе about_Scheduled_Jobs_Advanced.

Дополнительные сведения о командлетах, содержащихся в модуле PSScheduledJob , см. в разделе PSScheduledJob.

Создание запланированного задания

Чтобы создать запланированное задание, используйте Register-ScheduledJob командлет. Командлету требуется имя, а также команды или скрипт, выполняемые заданием. Можно либо запустить задание немедленно, добавив параметр RunNow , либо создать триггер задания и задать параметры задания при создании задания или изменить существующее задание.

Чтобы создать задание, запускающее скрипт, используйте параметр FilePath , чтобы указать путь к файлу скрипта. Чтобы создать задание, запускающее команды, используйте параметр ScriptBlock .

Register-ScheduledJob Командлет создает процессжоб, который выполняет Get-Process команду. Это запланированное задание имеет параметры задания по умолчанию и не имеет триггера задания.

Создание триггера задания

Триггеры заданий запускают запланированное задание автоматически. триггер задания может быть однократным или повторяющимся или событием, например при входе пользователя в систему или запуске Windows. Каждое задание может иметь ноль, один или несколько триггеров заданий.

Чтобы создать триггер задания, используйте New-JobTrigger командлет. Следующая команда создает триггер задания, который запускает задание каждый понедельник и четверг в 5:00 AM. Команда сохраняет триггер задания в $T переменной.

Триггеры задания не являются обязательными. Вы можете запустить запланированное задание в любое время, добавив параметр RunNow в Register-ScheduledJob команду или используя Start-Job командлеты.

Добавление триггера задания

При добавлении триггера задания в запланированное задание триггер задания добавляется в XML-файл запланированного задания для запланированного задания и становится частью запланированного задания.

Вы можете добавить триггер задания в запланированное задание при создании запланированного задания или изменить существующее задание. Вы можете в любое время изменить триггер задания для запланированного задания.

PowerShell использует одни и те же Триггеры заданий, которые планировщик задач использует. Подробные сведения о триггерах заданий см. в разделе справки по командлету New-JobTrigger .

В следующем примере Сплаттинг используется для создания $JobParms значений параметров, которые передаются в Register-ScheduledJob командлет. Дополнительные сведения см. в разделе about_Splatting. md. Register-ScheduledJob Использует @JobParms для создания запланированного задания. Для указания триггера задания в переменной используется параметр Trigger $T .

Вы также можете добавить триггер задания в существующее запланированное задание в любое время. Add-JobTrigger Командлет добавляет триггер задания в $T переменную в запланированное задание процессжоб .

В результате триггер задания запускает процессжоб автоматически каждый понедельник и четверг в 5:00 AM.

Как получить триггер задания

Чтобы получить триггер задания для запланированного задания, используйте Get-JobTrigger командлет. Используйте параметры Name, ID и InputObject , чтобы указать запланированное задание, а не триггер задания.

Get-JobTrigger Возвращает триггер задания процессжоб.

Создание параметров задания

Параметры задания устанавливают условия для запуска и выполнения задания. Каждое задание имеет параметры задания по умолчанию, если они не были изменены. Поскольку параметры задания могут препятствовать запуску задания в запланированное время, важно понимать параметры задания и использовать их аккуратно.

PowerShell использует те же параметры задания, которые планировщик задач использует. Подробные сведения о параметрах задания см. в разделе справки New-scheduledjoboptions.

Параметры задания хранятся в XML-файле запланированного задания. Вы можете задать параметры задания при создании запланированного задания или изменить их в любое время.

New-ScheduledJobOption Командлет создает параметр запланированного задания, в котором параметру запланированного задания вакеторун присвоено значение true. Параметр вакеторун запускает запланированное задание, даже если компьютер находится в спящем или спящем режиме в запланированное время запуска. Команда сохраняет параметры задания в $O переменной.

Получение параметров задания

Чтобы получить параметры задания запланированного задания, используйте Get-ScheduledJobOption командлет. Используйте параметры Name, ID и InputObject , чтобы указать запланированное задание, а не параметры задания.

Get-ScheduledJobOption Возвращает параметры задания процессжоб.

Изменение параметров задания

Можно изменить параметры задания запланированного задания при создании запланированного задания или изменении существующего задания.

Сплаттед $JobParms передаются в Add-JobTrigger командлет для создания задания процесса. Для указания параметров задания в переменной используется параметр scheduledjoboptions $O .

Можно также изменить параметры задания на существующее запланированное задание в любое время. Следующая команда использует командлет, Set-ScheduledJobOption чтобы изменить значение параметра вакеторун процессжоб scheduledJob на true.

Set Командлеты в модуле PSScheduledJob , такие как Set-ScheduledJobOption командлет, не имеют параметров имени или идентификатора . Параметр InputObject можно использовать для указания параметров запланированного задания или передачи по конвейеру запланированного задания из Get-ScheduledJobOption командлета в Set-ScheduledJobOption .

В этом примере используется Get-ScheduledJob командлет для получения процессжоб. Он использует Get-ScheduledJobOption командлет, чтобы получить параметры задания в процессжоб , и командлет, Set-ScheduledJobOption чтобы изменить параметр задания вакеторун в процессжоб на true.

Получение экземпляров запланированных заданий

При запуске запланированного задания PowerShell создает экземпляр задания, аналогичный стандартному фоновому заданию PowerShell. Get-Job Stop-Job Для управления экземплярами заданий можно использовать командлеты задания, такие как, и Receive-Job .

Чтобы использовать командлеты задания для экземпляров запланированных заданий, необходимо импортировать модуль PSScheduledJob в сеанс. Чтобы импортировать модуль PSScheduledJob , введите Import-Module PSScheduledJob или используйте любой командлет запланированного задания, например Get-ScheduledJob .

Чтобы получить все экземпляры запланированных заданий PowerShell и все активные стандартные задания, используйте Get-Job командлет. Import-Module Командлет импортирует модуль PSScheduledJob и Get-Job получает задания на локальном компьютере.

Get-Job Возвращает экземпляры процессжоб на локальном компьютере.

Отображение по умолчанию не показывает время начала, которое обычно различает экземпляры одного и того же запланированного задания.

Get-Job Командлет отправляет объекты по конвейеру. Format-Table Командлет отображает свойства Name, ID и BeginTime запланированного задания.

Получение результатов запланированного задания

Чтобы получить результаты экземпляра запланированного задания, используйте Receive-Job командлет.

Чтобы использовать командлеты задания для экземпляров запланированных заданий, необходимо импортировать модуль PSScheduledJob в сеанс. Чтобы импортировать модуль PSScheduledJob , введите Import-Module PSScheduledJob или используйте любой командлет запланированного задания, например Get-ScheduledJob .

В этом примере получаются результаты последнего экземпляра запланированного задания процессжоб (ид = 51).

Результаты запланированных заданий сохраняются на диске, поэтому параметр сохранения Receive-Job не требуется. Однако без параметра сохранения результаты запланированного задания можно получить только один раз в каждом сеансе PowerShell. Чтобы запустить новый сеанс PowerShell, введите PowerShell или откройте новое окно PowerShell.

Создаем задачи в планировщике с Powershell изменяем и запускаем их

Навигация по посту

Работа планировщика в Powershell

Отличительной чертой работы Powershell является то, что мы должны создать каждый из объектов (результат команд) планировщика отдельно, а затем объединить их с помощью 1 команды. Сами объекты делятся на следующие:

  1. Action (Действие) - определяет что мы должны запустить. Действия проявляются как программа (например браузер) с аргументами (открыть определенный сайт). В одной задаче может быть до 32 действий;
  2. Trigger (Триггер) - это событие при котором должно запуститься действие. Событие может быть привязано к времени или каким-то процессом в системе (включение компьютера, вход пользователя и т.д.). Время можно устанавливать как определенное, например в 14:00, так и интервальное - каждые 2 часа. Так же как и действий триггеров может быть несколько.
  3. Settings (Настройки) - дополнительные условия обработки задач. Это может быть перезапуск в случае сбоя задачи или самоудаление если задача не используется.
  4. Security Options (Параметры безопасности) - определяют привилегии и пользователя от имени которого будут запущены задания.

Планировщик задач Windows

3 и 4 пункт не является обязательными при создании задачи т.к. уже имеет настройки по умолчанию.

За создание задач в планировщике отвечает модуль ScheduledTasks, который имеет следующие команды:


Создание скрипта для тестирования

Скрипт сбора логов и сохранения в XML

Пример работы скрипта сбора логов и сохранения в XML

Создание выполняемого действия для планировщика

Создание действия в Powershell для планировщика задач

Действия выше аналогичны следующим настройкам в интерфейсе (т.е. так мы обычно добавляем скрипт Powershell в планировщик):

Создание задачи в планировщике для работы скрипта Powershell

Создание временного события - триггера

Системные события, которые мы можем использовать, следующие:

  • AtLogOn - во время входа пользователя в систему;
  • AtStartup - во время запуска системы.

Аргументы связанные со временем:

  • At - точное время выполнение скрипта;
  • Daily - ежедневно;
  • DaysInterval - интервал в днях. Если указать цифру 1, то подразумевается, что задача будет запускаться ежедневно. Если указать 2 - то задача будет запускаться через день;
  • DaysOfWeek - день недели, когда будет выполнен запуск. Возможны варианты: Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday;
  • Once - запуск будет выполнен единожды;
  • Weekly - запуск по неделям;
  • WeeksInterval - интервал между неделями;
  • RandomDelay - указывает задержку между запусками. Задержка определяется случайно от указанного значения. Принимает не число, а объект TimeSpan;
  • RepetitionDuration - Срок действия задачи. Принимает не число, а объект TimeSpan.
  • RepetitionInterval - время через которое задача будет повторяться. Принимает не число, а объект TimeSpan.

Большую часть команд, связанных со временем, мы можем сочетать вместе. Так, например, мы создадим триггер выполнится однажды в 13:00:

Создание триггера в Powershell для планировщика задач

Еще несколько примеров:

Создание триггера в Powershell для планировщика задач с повторением

Учитывайте, что вы можете использовать несколько триггеров и действий. Для этого вы должны перечислить их через запятую.

TaskPath указывает где была создана задача. В примере выше это произошло в корне планировщика:

Просмотр задач в планировщике Windows

Вы можете использовать аналогичный параметр для регистрации задачи в другой директории:

Способа узнать путь два:

В powershell есть еще одна команда, которая может участвовать в создании задач "New-ScheduledTask". Основное отличие такой команды в том, она не регистрирует (добавляет) задачу в сервис планировщика. Если бы мы использовали обе команды это бы выглядело так:

Запуск и получение дополнительной информации

Запуск задачи планировщика с Powershell

У нас так же есть 2 команды, которые возвращают информацию о задачах.

Первая команда просто возвращает список задач, которые есть в каталогах планировщика их статус и путь:

Получение задач планировщика с Powershell

У команды запуска и получения задач из планировщика можно использовать параметры:

  • TaskName - имя объекта;
  • TaskPath - путь до объекта.

Более полезная команда следующая, так как вернет немного больше информации:

Получение информации о задаче планировщика с Powershell

Само собой все эти команды можно использовать в конвейере:

Если задача занимает много времени и ее нужно остановить - можно выполнить следующие действия:

Фильтрация через Where-Object в Powershell с примерами

Изменение пользователя, параметров безопасности и уровня запуска

  • Пользователь, от имени которого будет выполнен запуск;
  • Выполняется ли задача для вошедших в систему пользователей;
  • Привилегии запуска (от пользователя/администратора);
  • Совместимость.

В графическом интерфейсе эти параметры настраиваются в следующем блоке:

Выполнение задачи планировщика для пользователей вошедших в систему

С помощью следующих команд мы изменим пользователя, повысим права и изменим совместимость:

Использование совместимости и другого пользователя в планировщике задач с Powershell

Если у вас будет следующая ошибка, то скорее всего она связана с неверным пользователем:

  • Set-ScheduledTask : No mapping between account names and security IDs was done.

Само собой эти же объекты можно использовать при создании (регистрации) задачи в планировщике:

Учитывайте, что у New-ScheduledTaskSettingsSet около 30 возможных параметров (работа при отключенной батареи, максимальное количество перезапусков и т.д.). В примере выше рассмотрено лишь несколько.

Изменение триггеров и действий

С помощью Set-ScheduledTask так же добавляются и изменяются триггеры и действия. Изменение будут заключаться в полной замене существующих триггеров и действий у задач. Вам просто нужно создать объект по аналогии с тем, как это делалось в предыдущих разделах:

Запуск задачи в определенное время с Powershell

Бэкап, удаление и восстановление задач планировщика с Powershell

Удобной возможностью использования Powershell является импорт и экспорт задач планировщика. По сути вы можете создать шаблон, который можно использовать на разных компьютерах без особой работы с кодом. По умолчанию, сам Powershell, не предоставляет прямой возможности бэкапа и восстановления, но это можно сделать через другие команды.

Резервное копирование

Для бэкапа мы можем использовать команду Export-CliXml. Для этого нам нужно будет получить задачу и использовать конвейер:

Резервное копирование задач планировщика с Powershell

Удаление, отключение и включение

Удаление задачи планировщика с Powershell

Если требуется только отключить задачу используйте Disable:

Восстановление

Восстановление выполняется в несколько шагов. Первое - мы должны выполнить импорт XML документа в Powershell:

На одном из сайтов я прочитал, что следующий параметр нужно изменять на "Interactive", так как без него не будет работать задача, но у меня этот параметр не изменялся при экспорте:

Изменение параметра входа пользователей для планировщика с Powershell

Этот параметр связан со входом пользователя через GUI. Аналогичное название в интерфейсе планировщика задач "Выполнять только для пользователей, вошедших в систему". Если этот параметр у вас отличается - вы сможете изменить его так:

Далее нам нужно зарегистрировать эту задачу определяя каждый из параметров отдельно:

Восстановление бэкапа планировщика задач Powershell

Как создавать команды и функции в Powershell вызывать их и передавать параметры

Анализ выполнения и завершения, а так же сравнение

Используя предыдущие команды мы можем выполнить некоторую автоматизацию. Например так мы можем увидеть результат выполненных задач:

Получение результата выполненной задачи планировщика

Часть этих кодов имеет следующую расшифровку (был использован автоматический переводчик):

  • 0 - операция успешно завершена.
  • 1 - Вызывается неправильная функция или неизвестная функция. 2 Файл не найден.
  • 10 - Неправильная среда.
  • 267008 - Задача готова к запуску в следующее запланированное время.
  • 267009 - В данный момент идет выполнение.
  • 267010 - Задача не будет запущена в запланированное время, потому что она отключена.
  • 267011 - Запуск еще не был выполнен.
  • 267012 - Для этой задачи больше нет запланированных запусков.
  • 267013 - Одно или несколько свойств, необходимых для запуска этой задачи по расписанию, не были установлены.
  • 267014 - Последний запуск задачи был прерван пользователем.
  • 267015 - Либо у задачи нет триггеров, либо существующие триггеры отключены или не установлены.
  • 2147750671 - Учетные данные повреждены.
  • 2147750687 - Экземпляр этой задачи уже запущен.
  • 2147943645 - Служба недоступна (установлен ли флажок «Запускать только при входе пользователя в систему»?).
  • 3221225786 - Приложение было закрыто в результате нажатия CTRL + C.
  • 3228369022 - Неизвестное программное исключение.

Альтернативное - вы можете открыть интерфейс планировщика и посмотреть какая ошибка отображается там (она будет текстом).

Получение результата выполненной задачи планировщика в GUI

Далее вы можете создать скрипт для поиска сбойных задач. Например меня интересует только задачи со сбоями, а не успешно работающие. Так как я не знаю всех кодов, мне нужно будет исключить только коды успешного выполнения:

Поиск ошибок в планировщике задач

Такой же подход можно использовать при поиске странных сервисов-программ. Например у нас есть эталонный компьютер/сервер и на нем созданы все нужные задачи. Всех их мы помещаем в один объект, а затем сравниваем с другими экземплярами:

Получение имен задач планировщика с Powershell

Далее, через разные средства, мы можем сравнить этот список на других компьютерах:

Каждому системному администратору Windows приходилось создавать задания планировщика из графической консоли Task Scheduler. Это довольно простая и тривиальная задача. В этой небольшой статье мы рассмотрим, как создавать задания планировщика с помощью команд PowerShell.

Предположим, нам нужно создать задачу, которая будет запускать определённый скрипт PowerShell каждый понедельник и четверг в 11:00.

Для создания нового задания мы воспользуемся командлетами модуля PSScheduledJob. Чтобы этот командлет работал в Windows 7, нужно установить как минимум PowerShell версии 3.0.

Запустим консоль Powesrhell с правами администратора и импортируем модуль PSScheduledJob.

Создадим новый триггер:

$Trigger = New-JobTrigger -Weekly -DaysOfWeek 1,4 -At 11:00PM

Теперь создадим новое задание с именем BackupDBTask и привяжем к нему созданный ранее триггер:

Register-ScheduledJob -Name BackupDBTask -FilePath "C:\ps\backupdb.ps1" -Trigger $Trigger

Register-ScheduledJob

Задание планировщика создано. Найти его в графической консоли Task Scheduler можно в разделе: Task Scheduler -> Task Scheduler Library -> Microsoft->Windows ->PowerShell -> SheduledJobs.

Windows -PowerShell - SheduledJobs

При создании нового задания PowerShell генерирует новый xml файл, который содержит определение задания. Найти этот файл можно в профиле текущего пользователя:

В дальнейшем данный xml файл можно использовать для импорта настроек задания на других компьютерах. Импорт (создание задания с настройками из xml) выполняется такой командой:

Register-ScheduledTask -Xml (Get-Content '\\srv1\ScheduledJobDefinition.xml' | out-string) -TaskName "BackupDBTask"

В каталоге Output хранится история запуска задания.

AppData\Local\Microsoft\Windows\PowerShell\ScheduledJobs\

В Windows 8 / Windows Server 2012 и выше (в этих версиях появился встроенный PowerShell 3.0) при создании задания планировщика импортировать модуль PSScheduledJob не нужно.

Просто создайте новый триггер:

$Trigger = New-JobTrigger -Weekly -DaysOfWeek 1,4 -At 08:00PM

Если нужно запускать задание от определенного пользователя, нужно получить его пароль (он будет сохранен в менеджере паролей, что конечно, не очень безопасно):

$credent = Get-Credential contoso\server-admin1

Чтобы задание запускалось с повышенными правами, включим флаг RunElevated:

$elevat = New-ScheduledJobOption –RunElevated

Теперь создадим новое задание

Register-ScheduledJob -Name BackupDBTask2 -FilePath C:\ps\backupdb.ps1 -Trigger $Trigger -Credential $credent –ScheduledJobOption $elevat

запусить задание планировщика с повышенными правами

Получить информацию о всех включенных заданиях в разделе Microsoft\Windows\Powershell можно так:

Get-ScheduledTask -TaskPath \Microsoft\Windows\Pow*| ? state -ne Disabled

Итак, предположим, у меня есть скрипт start.ps1, который мне необходимо запускать ежедневно в течении 10 дней. Есть два способа решить эту задачу.

Способ 1

Для запуска скрипта воспользуемся оснасткой Task Scheduler, он же планировщик заданий. Найти его можно в разделе Administrative Tools, либо нажав Win+R и введя команду taskschd.msc. Открываем планировщик и в разделе Actions выбираем пункт Create Task.

создаем запланированное задание в Task Scheduler

На вкладке General указываем имя и описание задания, а также (по необходимости) пользователя, от имени которого задание будет запускаться. Для того, чтобы задание выполнялось вне зависимости от того, залогинен ли пользователь в системе, выбираем опцию «Run whether user is logged on or not». Если для выполнения задания требуется повышение привилегий, то отмечаем опцию «Run with highest privileges».

новое задание, вкладка General

Примечание. Если вы хотите запускать задание чаще, чем раз в день, то надо выбрать одноразовое выполнение (One time), а в разделе Advanced settings отметить пункт Repeat task every и указать время повторения, минимум 5 минут, максимум 1 час. Если этого недостаточно, то дополнительно в поле Delay task for up to можно указать временную задержку.

задаем условие для запуска задания

И основное. Переходим на вкладку Action и указываем действие для запланированного задания. Напомню, что в целях безопасности PowerShell скрипты могут выполняться только интерактивно, то есть сначала надо запустить оболочку PowerShell и уже в ней указать путь к скрипту. Поэтому в поле «Action» указываем запуск powershell.exe, а в поле «Add Arguments» параметр -File и путь к нашему скрипту, вот так:

Также в поле аргументы можно указать:

указываем действие для запланированного задания

Заполнив необходимые поля жмем ОК и сохраняем задание. Теперь скрипт будет запускаться по расписанию ежедневно в заданное время в течении 10 дней.

Способ 2

В PowerShell 3.0 появился новый функционал Sheduled Job, дающий возможность создавать запланированные задания прямо из консоли, не пользуясь оснасткой планировщика. Воспользуемся им для планового запуска нашего скрипта.

Сначала создаем расписание запуска (ежедневно в полпятого вечера, в течении 10 дней):

$t = New-JobTrigger -Daily -At 4:30PM -DaysInterval 10

Затем сохраняем в переменной учетные данные:

$cred = Get-Credential contoso\administrator

В качестве опции указываем запуск задания с повышенными привилегиями:

$o = New-ScheduledJobOption -RunElevated

И регистрируем задание с именем Start:

Register-ScheduledJob -Name Start -FilePath C:\Scripts\start.ps1 -Trigger $t -Credential $cred -ScheduledJobOption $o

создание запланированного задания в PowerShell

Чтобы убедится в том, что задание создано, можно открыть планировщик и найти наше задание в разделе Microsoft\Windows\PowerShell\SheduledJobs.

запланированное задание в Task Sheduler

Execution Policy

В заключение напомню об одном немаловажном моменте, а именно о политике выполнения скриптов Execution Policy. Посмотреть текущее значение политики можно командой Get-ExecutionPolicy . Политика выполнения может иметь значения:

Обычно для безпроблемного выполнения скриптов достаточно задать значение RemoteSigned. Изменить текущее значение можно командой Set-ExecutionPolicy , например:

Set-ExecutionPolicy RemoteSigned -force

Примечание. Если указанная в команде политика выполнения противоречит групповой политике, то параметр запишется в реестр, но действовать не будет.

Читайте также: