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

Для создания ‘action’ мы должны указать программу и аргументы. В качестве программы будет сам интерпретатор ‘powershell.exe’, а аргументом будет путь до скрипта. У нас будет несколько объектов (результат команд) и все их нужно будет объединить. Что бы это было возможным мы должны поместить результаты работы в переменные:

PS C:\> $task_action = New-ScheduledTaskAction -Execute 'powershell.exe' -Argument '-File C:\scheduler_task.ps1'

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

Следующим мы определим, когда мы будем запускать задачу. Это делается с помощью команды ‘New-ScheduledTaskTrigger’. Эта команда имеет множество параметров, которые делятся на системные события и временные. 

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

  • 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:

PS C:\> $task_trigger = New-ScheduledTaskTrigger -Once -At 13:00

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

# Ежедневно в 14:00
PS C:\> New-ScheduledTaskTrigger -Daily -At 14:00

# Запуск каждые 2 дня в 14:00
PS C:\> New-ScheduledTaskTrigger -Daily -DaysInterval 2 -At 14:00

# Каждый 2-ой понедельник в 14:00
PS C:\> New-ScheduledTaskTrigger -Weekly -WeeksInterval 2 -DaysOfWeek Monday -At 14:00

3. Регистрация задачи в планировщике.

Теперь, после выполнения минимальных требований в виде ‘action’ и ‘trigger’, мы должны объединить эти объекты. Это делается с помощью команды ‘Register-ScheduledTask’. Дополнительно мы можем определить название и описание создаваемого объекта:

PS C:\> $name = 'Сбор логов'
PS C:\> $description = 'Сбор логов приложений каждые 5 минут в папку c:\logs'

PS C:\> Register-ScheduledTask -TaskName $name -Description $description -Action $task_action -Trigger $task_trigger

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

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

# Объединение объектов
PS C:\> $task = New-ScheduledTask -Action $action1,$action2 -Trigger $trigger1,$trigger2

# Их активация
PS C:\> Register-ScheduledTask -TaskName 'SomeTask' -TaskPath '\Microsoft' -InputObject $task

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

Для запуска задачи, не зависимо от триггеров, используется команда ‘Start-ScheduledTask’:

PS C:\> Start-ScheduledTask -TaskName 'Сбор логов'

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

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

PS C:\> Get-ScheduledTask

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

  • TaskName — имя объекта;
  • TaskPath — путь до объекта.
PS C:\> Get-ScheduledTask -TaskPath '\'

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

PS C:\> Get-ScheduledTaskInfo -TaskName 'Сбор логов'

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

PS C:\> Get-ScheduledTask -TaskName 'Сбор логов' | Start-ScheduledTask

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

PS C:\> Stop-ScheduledTask 'Сбор логов'

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

При удалении задачи, по умолчанию, запрашивается подтверждение. Что бы этого не было добавляется ключ ‘Confirm’:

PS C:\> Unregister-ScheduledTask -TaskName 'Сбор логов' -Confirm:$False

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

PS C:\> Disable-ScheduledTask -TaskName 'Сбор логов'

Включение:

PS C:\> Enable-ScheduledTask -TaskName 'Сбор логов'

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

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

PS C:\> Get-ScheduledTask -TaskName 'Сбор логов' | Export-Clixml 'C:\LogTaskBackup.xml'

Для экспорта в Powershell так же есть ‘Export-ScheduledTask’, но нет аналогичной команды импорта. Что бы импортировать такие файлы-задачи мы можем использовать только GUI. Из-за этого она не приведена в примере выше.

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

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

PS C:\> $task = Import-Clixml -Path 'C:\LogTaskBackup.xml'

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

$task.Principal

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

PS C:\> $task.Principal.LogonType = 'Interactive'

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

PS C:\> Register-ScheduledTask `
   -TaskName $task.TaskName `
   -Action $task.Actions `
   -Trigger $task.Triggers `
   -Settings $task.Settings `
   -Principal $task.Principal `
   -User 'administrator' `
   -Password '123'