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'