Большинство пользователей и администраторов привыкли использовать графический интерфейс консоли Taskschd.msc для создания заданий планировщика Windows (Task Scheduler), запускаемых по расписанию. Однако в различных скриптах и автоматизируемых задачах для создания заданий планировщика гораздо удобнее использовать возможности PowerShell. В этой статье мы покажем, как создавать и управлять заданиями планировщика Windows из PowerShell.
Содержание:
- Управление заданиями Task Scheduler с помощью PowerShell
- Как создать задание планировщика с помощью PowerShell?
- Получение информации и запуск заданий планировщика из PowerShell
- Экспорт и импорт заданий планировщика в XML файл
Управление заданиями Task Scheduler с помощью PowerShell
В Windows 10/Windows Server 2016 для управления задачами в планировщике используется PowerShell модуль ScheduledTasks. Список командлетов в модуле можно вывести так:
Get-Command -Module ScheduledTasks
- Disable-ScheduledTask
- Enable-ScheduledTask
- Export-ScheduledTask
- Get-ClusteredScheduledTask
- Get-ScheduledTask
- Get-ScheduledTaskInfo
- New-ScheduledTask
- New-ScheduledTaskAction
- New-ScheduledTaskPrincipal
- New-ScheduledTaskSettingsSet
- New-ScheduledTaskTrigger
- Register-ClusteredScheduledTask
- Register-ScheduledTask
- Set-ClusteredScheduledTask
- Set-ScheduledTask
- Start-ScheduledTask
- Stop-ScheduledTask
- Unregister-ClusteredScheduledTask
- Unregister-ScheduledTask
Совет. Ранее в Windows для создания и управления заданиями планировщика в основном использовались встроенная консольная утилита schtasks.exe.
Как создать задание планировщика с помощью PowerShell?
В современных версиях PowerShell (начиная с PowerShell 3.0 в Windows Server 2012/Windows для создания заданию планировщика нужно использовать командлеты New-ScheduledTaskTrigger и Register-ScheduledTask.
Предположим, наша задача создать задание планировщика, которое должно запускаться при загрузке компьютера (или в определенное время) и выполнять какой-то PowerShell скрипт. Создадим задание планировщика с именем StartupScript_PS. Данное задание должно каждый день в 10:00 запускать PowerShell скрипт, хранящийся в файле C:PSStartupScript.ps1 из-под учетной записи системы (SYSTEM). Задание будет выполняться с повышенными привилегиями (галка “Run with highest privileges”).
$Trigger= New-ScheduledTaskTrigger -At 10:00am -Daily
$User= "NT AUTHORITYSYSTEM"
$Action= New-ScheduledTaskAction -Execute "PowerShell.exe" -Argument "C:PSStartupScript.ps1"
Register-ScheduledTask -TaskName "StartupScript_PS" -Trigger $Trigger -User $User -Action $Action -RunLevel Highest –Force
Если задание успешно создано, появится надпись Ready.
Теперь ваш PowerShell скрипт будет запускаться по указанному расписанию. Если на вашем компьютере настроена PowerShell Execution Policy, блокирующая запуск скриптов PS1, вы можете запустить скрипт их планировщика с параметром –Bypass.
Используйте такую строку при создании нового задания:
$Action= New-ScheduledTaskAction -Execute "PowerShell.exe" -Argument “-NoProfile -NoLogo -NonInteractive -ExecutionPolicy Bypass -File C:PSStartupScript.ps1"
Совет. Если нужно, чтобы задание запускалось каждый раз при загрузке компьютера, первая строка должна быть такой:
$Trigger= New-ScheduledTaskTrigger -AtStartup
Если нужно выполнять задание при входе пользователя:
$Trigger= New-ScheduledTaskTrigger –AtLogo
n
Откройте консоль
Taskschd.msc
и проверьте, что проверьте, что в Task Scheduler Library появилось новое задание планировщика.
В версии Powershell 2.0 (Windows 7, Windows Server 2008 R2) для создания повторяющегося задания (ScheduledJob) из PowerShell необходимо воспользоваться COM интерфейсом Schedule.Service (либо обновите версию PowerShell). В этом примере мы создадим задание планировщика, которое во время запускает определённый файл с PowerShell скриптом во время загруки. Задание выполняется с правами системы (System).
$TaskName = "NewPsTask"
$TaskDescription = "Запуск скрипта PowerShell из планировщика"
$TaskCommand = "c:windowssystem32WindowsPowerShellv1.0powershell.exe"
$TaskScript = "C:PSStartupScript.ps1"
$TaskArg = "-WindowStyle Hidden -NonInteractive -Executionpolicy unrestricted -file $TaskScript"
$TaskStartTime = [datetime]::Now.AddMinutes(1)
$service = new-object -ComObject("Schedule.Service")
$service.Connect()
$rootFolder = $service.GetFolder("")
$TaskDefinition = $service.NewTask(0)
$TaskDefinition.RegistrationInfo.Description = "$TaskDescription"
$TaskDefinition.Settings.Enabled = $true
$TaskDefinition.Settings.AllowDemandStart = $true
$triggers = $TaskDefinition.Triggers
#http://msdn.microsoft.com/en-us/library/windows/desktop/aa383915(v=vs.85).aspx
$trigger = $triggers.Create(8)
Получение информации и запуск заданий планировщика из PowerShell
Вы можете вывести список всех активных заданий планировщика в Windows с помощью команды:
Get-ScheduledTask -TaskPath | ? state -ne Disabled
Чтобы получить информацию о конкретном задании:
Get-ScheduledTask CheckServiceState_PS| Get-ScheduledTaskInfo
LastRunTime : 4/6/2021 10:00:00 AM LastTaskResult : 267011 NextRunTime : 4/7/2021 10:00:00 AM NumberOfMissedRuns : 0 TaskName : CheckServiceState_PS TaskPath : PSComputerName :
Вы можете отключить это задание:
Get-ScheduledTask CheckServiceState_PS | Disable-ScheduledTask
Чтобы включить задание:
Get-ScheduledTask CheckServiceState_PS | Enable-ScheduledTask
Чтобы запустить задание немедленно (не дожидаясь расписания), выполните:
Start-ScheduledTask CheckServiceState_PS
Чтобы полностью удалить задание из Task Scheduler:
Unregister-ScheduledTask -TaskName CheckServiceState_PS
Если нужно изменить имя пользователя, из-под которого запускается задание и, например, режим совместимости, используйте командлет Set-ScheduledTask:
$task_user = New-ScheduledTaskPrincipal -UserId 'winitprokbuldogov' -RunLevel Highest
$task_settings = New-ScheduledTaskSettingsSet -Compatibility 'Win7'
Set-ScheduledTask -TaskName CheckServiceState_PS -Principal $task_user -Settings $task_settings
При появлении ошибки “Set-ScheduledTask : No mapping between account names and security IDs was done” проверьте, что у вас указано правильное имя пользователя.
Экспорт и импорт заданий планировщика в XML файл
С помощью PowerShell можно экспортировать любое задания планировщика в текстовый XML файл для распространения на другие компьютеры. Вы можете экспортировать задание из графического интерфейса Task Scheduler или из консоли PowerShell.
Следующая команда экспортирует задание StartupScript_PS в файл StartupScript_PS.xml:
Export-ScheduledTask "StartupScript_PS" | out-file c:tempStartupScript_PS.xml
Командлет Export-ScheduledTask не доступен в PowerShell 2.0. Поэтому в Windows 7 / 2008 R2 для экспорта настроек задания в XML файл лучше воспользоваться встроенной утилитой schtasks, вывод которой нужно перенаправить в текстовый файл:
schtasks /query /tn "NewPsTask" /xml >> "c:psNewPsTask.xml"
После того, как настройки задания планировщика экспортированы в XML файл, его можно импортировать на любой другой компьютер с помощи графической консоли, SchTasks.exe или PowerShell.
Воспользуйте командлетом PowerShell Register-ScheduledTask чтобы параметры задания из файла и зарегистрировать его:
Register-ScheduledTask -Xml (Get-Content “\Server1publicNewPsTask.xml” | out-string) -TaskName "NewPsTask"
Примечание. В PowerShell 2.0 (Windows 7/Server 2008 R2) импорт задания также проще выполнить с помощью утилиты schtasks. Первая команда создаст новое задание. Вторая – сразу запустит его (не дожидаясь срабатывания триггера).
schtasks /create /tn "NewPsTask" /xml "\Server1publicNewPsTask.xml " /ru corpaaivanov /rp Pa$$w0rd
schtasks /Run /TN "NewPsTask"
Обратите внимание, что в этом примере указаны данные учетной записи, из-под которой будет запускаться задание. Если имя и пароль учетной записи не указаны, то т.к. они не хранятся в задании, они будут запрошены при импорте.
В задачи практически любого системного администратора входит написание различных скриптов и их запуск. Запланировать запуск скрипта по расписанию с помощью Task Sheduler — задача несложная, но при использовании PowerShell есть некоторые нюансы, о которых я расскажу в этой статье.
Итак, предположим, у меня есть скрипт start.ps1, который мне необходимо запускать ежедневно в течении 10 дней. Есть два способа решить эту задачу.
Способ 1
Для запуска скрипта воспользуемся оснасткой Task Scheduler, он же планировщик заданий. Найти его можно в разделе Administrative Tools, либо нажав Win+R и введя команду taskschd.msc. Открываем планировщик и в разделе Actions выбираем пункт Create Task.
На вкладке General указываем имя и описание задания, а также (по необходимости) пользователя, от имени которого задание будет запускаться. Для того, чтобы задание выполнялось вне зависимости от того, залогинен ли пользователь в системе, выбираем опцию «Run whether user is logged on or not». Если для выполнения задания требуется повышение привилегий, то отмечаем опцию «Run with highest privileges».
Далее идем на вкладку Triggers и создаем новый триггер, в котором будет храниться расписание запуска нашего задания. В поле Start указываем дату и время запуска, а в поле Expire — дату и время завершения задания. Указываем выполнять задание ежедневно (Daily) и задаем период повтора (Recur every) 1 день.
Примечание. Если вы хотите запускать задание чаще, чем раз в день, то надо выбрать одноразовое выполнение (One time), а в разделе Advanced settings отметить пункт Repeat task every и указать время повторения, минимум 5 минут, максимум 1 час. Если этого недостаточно, то дополнительно в поле Delay task for up to можно указать временную задержку.
И основное. Переходим на вкладку Action и указываем действие для запланированного задания. Напомню, что в целях безопасности PowerShell скрипты могут выполняться только интерактивно, то есть сначала надо запустить оболочку PowerShell и уже в ней указать путь к скрипту. Поэтому в поле «Action» указываем запуск powershell.exe, а в поле «Add Arguments» параметр -File и путь к нашему скрипту, вот так:
-File ″C:Scriptsstart.ps1″
Также в поле аргументы можно указать:
-Command — выполняет указанные команды и любые другие параметры. Этот параметр тоже можно использовать для запуска скрипта, например: -Command ″& {C:Scriptsstart.ps1}″. Кроме того, с его помощью можно передавать в скрипт параметры: -Command ″& {C:Scriptsstart.ps1 -a 1 -b 3}″;
-ExecutionPolicy — задает политику выполнения скриптов для текущего сеанса, может принимать значения Unrestricted, RemoteSigned, AllSigned и Restricted. Заданная политика будет действовать только в текущем сеансе и имеет приоритет над любыми ранее созданными политиками;
-NonInteractive — отключить вывод интерактивных запросов к пользователю;
-WindowStyle Hidden — запуск окна PowerShell в скрытом режиме, незаметно для пользователя;
-NoProfile — предотвращает загрузку профиля, что может несколько ускорить выполнение скрипта;
-NoExit — оставить оболочку открытой после отработки скрипта. Это может понадобиться при проверке и отладке скрипта.
Заполнив необходимые поля жмем ОК и сохраняем задание. Теперь скрипт будет запускаться по расписанию ежедневно в заданное время в течении 10 дней.
Способ 2
В PowerShell 3.0 появился новый функционал Sheduled Job, дающий возможность создавать запланированные задания прямо из консоли, не пользуясь оснасткой планировщика. Воспользуемся им для планового запуска нашего скрипта.
Сначала создаем расписание запуска (ежедневно в полпятого вечера, в течении 10 дней):
$t = New-JobTrigger -Daily -At 4:30PM -DaysInterval 10
Затем сохраняем в переменной учетные данные:
$cred = Get-Credential contosoadministrator
В качестве опции указываем запуск задания с повышенными привилегиями:
$o = New-ScheduledJobOption -RunElevated
И регистрируем задание с именем Start:
Register-ScheduledJob -Name Start -FilePath C:Scriptsstart.ps1 -Trigger $t -Credential $cred -ScheduledJobOption $o
Чтобы убедится в том, что задание создано, можно открыть планировщик и найти наше задание в разделе MicrosoftWindowsPowerShellSheduledJobs.
Примечание. Для каждого запланированного задания PowerShell в директории %systemdrive%Users%username%AppDataLocalMicrosoftWindowsPowerShellScheduledJobs создается одноименная папка. В этой папке находится само задание в XML-файле и папка Output, в которой, в подпапках по времени выполнения, хранится история выполнения задания — результат выполнения (файлs Result.xml) и статус задания (Status.xml). Эти файлы могут пригодиться для отладки и диагностики в том случае, если задание не отрабатывает должным образом.
Execution Policy
В заключение напомню об одном немаловажном моменте, а именно о политике выполнения скриптов Execution Policy. Посмотреть текущее значение политики можно командой Get-ExecutionPolicy. Политика выполнения может иметь значения:
• Restricted — блокируется выполнение любых скриптов. Значение по умолчанию;
• AllSigned — разрешено выполнение скриптов, имеющих цифровую подпись;
• RemoteSigned — скрипты, подготовленные на локальном компьютере, можно запускать без ограничений, скрипты, загруженные из Интернета — только при наличии цифровой подписи;
• Unrestricted — разрешено выполнение любых скриптов. При запуске неподписанного скрипта, который был загружен из Интернета, программа может потребовать подтверждение;
• Bypass — ничего не блокируется, никакие предупреждения и запросы не появляются.
Обычно для безпроблемного выполнения скриптов достаточно задать значение RemoteSigned. Изменить текущее значение можно командой Set-ExecutionPolicy, например:
Set-ExecutionPolicy RemoteSigned -force
Примечание. Если указанная в команде политика выполнения противоречит групповой политике, то параметр запишется в реестр, но действовать не будет.
В Windows есть механизм под названием ‘Планировщик заданий’ (Task Scheduler). Основная задача планировщика — выполнение задач в определенный момент времени или при определенном действии. В этой статье будет рассмотрены варианты работы с ним через Powershell. На примере мы создадим задание в виде скрипта с Powershell, изменим и удалим его используя только команды.
Работа планировщика в Powershell
Отличительной чертой работы Powershell является то, что мы должны создать каждый из объектов (результат команд) планировщика отдельно, а затем объединить их с помощью 1 команды. Сами объекты делятся на следующие:
- Action (Действие) — определяет что мы должны запустить. Действия проявляются как программа (например браузер) с аргументами (открыть определенный сайт). В одной задаче может быть до 32 действий;
- Trigger (Триггер) — это событие при котором должно запуститься действие. Событие может быть привязано к времени или каким-то процессом в системе (включение компьютера, вход пользователя и т.д.). Время можно устанавливать как определенное, например в 14:00, так и интервальное — каждые 2 часа. Так же как и действий триггеров может быть несколько.
- Settings (Настройки) — дополнительные условия обработки задач. Это может быть перезапуск в случае сбоя задачи или самоудаление если задача не используется.
- Security Options (Параметры безопасности) — определяют привилегии и пользователя от имени которого будут запущены задания.
3 и 4 пункт не является обязательными при создании задачи т.к. уже имеет настройки по умолчанию.
За создание задач в планировщике отвечает модуль ScheduledTasks, который имеет следующие команды:
Get-Command -Module ScheduledTasks
Создание скрипта для тестирования
Что бы продемонстрировать работу планировщика я создам скрипт, который будет сохранять логи с журнала Windows в папку ‘logs’. Ниже находится сам скрипт:
# Папка с логами
$log_dir = 'C:logs'
# Полный путь до файла с генерацией имени файла в виде даты
$log_file = $log_dir + "AppLog_$(Get-Date -format 'dd-mm-yyyy').xml"
# Получаем 10 последних логов приложений
$logs = Get-WinEvent -MaxEvents 10 -LogName application
# Сохраняем результат предыдущей команды в файл в формате XML
Export-CliXml -InputObject $logs -Path $log_file -Force
Команды выше не должны выдавать каких либо ошибок. Ошибка может быть, например, с несуществующей папкой ‘logs’. Сам скрипт я сохранил по пути ‘C:scheduler_task.ps1’. Его запуск не выдает каких-то ошибок:
.scheduler_task.ps1
У вас так же будет создан файл в папке ‘logs’.
Создание выполняемого действия для планировщика
Для создания ‘action’ мы должны указать программу и аргументы. В качестве программы будет сам интерпретатор ‘powershell.exe’, а аргументом будет путь до скрипта. Как говорилось раньше у нас будет несколько объектов (результат команд) и все их нужно будет объединить. Что бы это было возможным мы должны поместить результаты работы в переменные:
$task_action = New-ScheduledTaskAction `
-Execute 'powershell.exe' `
-Argument '-File C:scheduler_task.ps1'
Мы так же можем указать параметр ‘WorkingDirectory’, который определяет откуда и будет запущена программа. Учитывая, что ‘powershell.exe’ виден через системные переменные использовать параметр ‘WorkingDirectory’ нам не требуется.
Действия выше аналогичны следующим настройкам в интерфейсе (т.е. так мы обычно добавляем скрипт Powershell в планировщик):
Создание временного события — триггера
Следующим мы определим, когда мы будем запускать задачу. Это делается с помощью команды ‘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:
$task_trigger = New-ScheduledTaskTrigger -Once -At 13:00
Еще несколько примеров:
# Ежедневно в 14:00
New-ScheduledTaskTrigger -Daily -At 14:00
# Запуск каждые 2 дня в 14:00
New-ScheduledTaskTrigger -Daily -DaysInterval 2 -At 14:00
# Каждый 2-ой понедельник в 14:00
New-ScheduledTaskTrigger -Weekly -WeeksInterval 2 -DaysOfWeek Monday -At 14:00
Меня интересует ежедневный запуск задачи с периодичностью в 5 минут. Для ‘RepetitionInterval’, который устанавливает такие интервалы, нужно использовать дополнительную команду ‘New-TimeSpan’. В этой команде определим сам интервал:
$time = New-TimeSpan -Minutes 5
$task_trigger = New-ScheduledTaskTrigger -Once -At 0:00 -RepetitionInterval $time
Регистрация задачи в планировщике
Теперь, после выполнения минимальных требований в виде ‘action’ и ‘trigger’, мы должны объединить эти объекты. Это делается с помощью команды ‘Register-ScheduledTask’. Дополнительно мы можем определить название и описание создаваемого объекта:
$name = 'Сбор логов'
$description = 'Сбор логов приложений каждые 5 минут в папку c:logs'
Register-ScheduledTask -TaskName $name `
-Description $description `
-Action $task_action `
-Trigger $task_trigger
Учитывайте, что вы можете использовать несколько триггеров и действий. Для этого вы должны перечислить их через запятую.
TaskPath указывает где была создана задача. В примере выше это произошло в корне планировщика:
Вы можете использовать аналогичный параметр для регистрации задачи в другой директории:
Register-ScheduledTask -TaskName 'SomeTask' `
-TaskPath 'Microsoft' `
-Action $action1,$action2 `
-Trigger $trigger1,$trigger2
Способа узнать путь два:
- Через графический интерфейс;
- Через команду ‘Get-ScheduledTask’ (будет рассмотрена ниже).
В powershell есть еще одна команда, которая может участвовать в создании задач «New-ScheduledTask». Основное отличие такой команды в том, она не регистрирует (добавляет) задачу в сервис планировщика. Если бы мы использовали обе команды это бы выглядело так:
# Объединение объектов
$task = New-ScheduledTask -Action $action1,$action2 `
-Trigger $trigger1,$trigger2
# Их активация
Register-ScheduledTask -TaskName 'SomeTask' `
-TaskPath 'Microsoft' `
-InputObject $task
Запуск и получение дополнительной информации
Для запуска задачи, не зависимо от триггеров, используется команда ‘Start-ScheduledTask’:
Start-ScheduledTask -TaskName 'Сбор логов'
У нас так же есть 2 команды, которые возвращают информацию о задачах.
Первая команда просто возвращает список задач, которые есть в каталогах планировщика их статус и путь:
Get-ScheduledTask
У команды запуска и получения задач из планировщика можно использовать параметры:
- TaskName — имя объекта;
- TaskPath — путь до объекта.
Get-ScheduledTask -TaskPath ''
Более полезная команда следующая, так как вернет немного больше информации:
Get-ScheduledTaskInfo -TaskName 'Сбор логов'
Само собой все эти команды можно использовать в конвейере:
Get-ScheduledTask -TaskName 'Сбор логов' | Start-ScheduledTask
Если задача занимает много времени и ее нужно остановить — можно выполнить следующие действия:
Stop-ScheduledTask 'Сбор логов'
Изменение пользователя, параметров безопасности и уровня запуска
Создавая задачи в планировщике мы имеем блок ‘Security Options’, который чаще используется с настройками по умолчанию. В этом блоке определяются следующие параметры:
- Пользователь, от имени которого будет выполнен запуск;
- Выполняется ли задача для вошедших в систему пользователей;
- Привилегии запуска (от пользователя/администратора);
- Совместимость.
В графическом интерфейсе эти параметры настраиваются в следующем блоке:
Так же как и в случае с созданием задачи, в случае ее изменения мы создаем разные объекты (результаты команд), которые затем привязываем через команду ‘Set-SchedukedTask’.
С помощью следующих команд мы изменим пользователя, повысим права и изменим совместимость:
# Изменяем пользователя и повышаем права запуска
$task_user = New-ScheduledTaskPrincipal -UserId '.admin' -RunLevel Highest
# Изменяем совместимость
$task_settings = New-ScheduledTaskSettingsSet -Compatibility 'Win8'
# Добавляем объекты созданные выше к существующей задаче
Set-ScheduledTask -TaskName 'Сбор логов' -Principal $task_user -Settings $task_settings
Если у вас будет следующая ошибка, то скорее всего она связана с неверным пользователем:
- Set-ScheduledTask : No mapping between account names and security IDs was done.
Само собой эти же объекты можно использовать при создании (регистрации) задачи в планировщике:
$name = 'Task 3'
Register-ScheduledTask -TaskName $name `
-Action $task_action `
-Trigger $task_trigger `
-Principal $task_user `
-Settings $task_settings
Учитывайте, что у New-ScheduledTaskSettingsSet около 30 возможных параметров (работа при отключенной батареи, максимальное количество перезапусков и т.д.). В примере выше рассмотрено лишь несколько.
Изменение триггеров и действий
С помощью Set-ScheduledTask так же добавляются и изменяются триггеры и действия. Изменение будут заключаться в полной замене существующих триггеров и действий у задач. Вам просто нужно создать объект по аналогии с тем, как это делалось в предыдущих разделах:
$trigger = New-ScheduledTaskTrigger -Daily -At 14:00
$action = New-ScheduledTaskAction -Execute Calc.exe
Set-ScheduledTask -TaskName 'Сбор логов' -Action $action -trigger $trigger
Бэкап, удаление и восстановление задач планировщика с Powershell
Удобной возможностью использования Powershell является импорт и экспорт задач планировщика. По сути вы можете создать шаблон, который можно использовать на разных компьютерах без особой работы с кодом. По умолчанию, сам Powershell, не предоставляет прямой возможности бэкапа и восстановления, но это можно сделать через другие команды.
Резервное копирование
Для бэкапа мы можем использовать команду Export-CliXml. Для этого нам нужно будет получить задачу и использовать конвейер:
Get-ScheduledTask -TaskName 'Сбор логов' | Export-Clixml 'C:LogTaskBackup.xml'
Для экспорта в Powershell так же есть ‘Export-ScheduledTask’, но нет аналогичной команды импорта. Что бы импортировать такие файлы-задачи мы можем использовать только GUI. Из-за этого она не приведена в примере выше.
Удаление, отключение и включение
При удалении задачи, по умолчанию, запрашивается подтверждение. Что бы этого не было добавляется ключ ‘Confirm’:
Unregister-ScheduledTask -TaskName 'Сбор логов' -Confirm:$False
Если требуется только отключить задачу используйте Disable:
Disable-ScheduledTask -TaskName 'Сбор логов'
Включение:
Enable-ScheduledTask -TaskName 'Сбор логов'
Восстановление
Восстановление выполняется в несколько шагов. Первое — мы должны выполнить импорт XML документа в Powershell:
$task = Import-Clixml -Path 'C:LogTaskBackup.xml'
На одном из сайтов я прочитал, что следующий параметр нужно изменять на «Interactive», так как без него не будет работать задача, но у меня этот параметр не изменялся при экспорте:
$task.Principal
Этот параметр связан со входом пользователя через GUI. Аналогичное название в интерфейсе планировщика задач «Выполнять только для пользователей, вошедших в систему». Если этот параметр у вас отличается — вы сможете изменить его так:
$task.Principal.LogonType = 'Interactive'
Далее нам нужно зарегистрировать эту задачу определяя каждый из параметров отдельно:
Register-ScheduledTask `
-TaskName $task.TaskName `
-Action $task.Actions `
-Trigger $task.Triggers `
-Settings $task.Settings `
-Principal $task.Principal `
-User 'administrator' `
-Password '123'
Анализ выполнения и завершения, а так же сравнение
Используя предыдущие команды мы можем выполнить некоторую автоматизацию. Например так мы можем увидеть результат выполненных задач:
Get-ScheduledTask | Get-ScheduledTaskInfo | select *
Часть этих кодов имеет следующую расшифровку (был использован автоматический переводчик):
- 0 — операция успешно завершена.
- 1 — Вызывается неправильная функция или неизвестная функция. 2 Файл не найден.
- 10 — Неправильная среда.
- 267008 — Задача готова к запуску в следующее запланированное время.
- 267009 — В данный момент идет выполнение.
- 267010 — Задача не будет запущена в запланированное время, потому что она отключена.
- 267011 — Запуск еще не был выполнен.
- 267012 — Для этой задачи больше нет запланированных запусков.
- 267013 — Одно или несколько свойств, необходимых для запуска этой задачи по расписанию, не были установлены.
- 267014 — Последний запуск задачи был прерван пользователем.
- 267015 — Либо у задачи нет триггеров, либо существующие триггеры отключены или не установлены.
- 2147750671 — Учетные данные повреждены.
- 2147750687 — Экземпляр этой задачи уже запущен.
- 2147943645 — Служба недоступна (установлен ли флажок «Запускать только при входе пользователя в систему»?).
- 3221225786 — Приложение было закрыто в результате нажатия CTRL + C.
- 3228369022 — Неизвестное программное исключение.
Альтернативное — вы можете открыть интерфейс планировщика и посмотреть какая ошибка отображается там (она будет текстом).
Далее вы можете создать скрипт для поиска сбойных задач. Например меня интересует только задачи со сбоями, а не успешно работающие. Так как я не знаю всех кодов, мне нужно будет исключить только коды успешного выполнения:
# Коды, которые меня не интересуют (успешное выполнение)
$success_sc_codes = @(0, 267008, 267009, 267010, 267011, 267012)
# Получает объект, который содержит детальную информацию по всем процессам
$all_sc_tasks = Get-ScheduledTask | Get-ScheduledTaskInfo
foreach ($task in $all_sc_tasks){
# Если код не соответствует тому что есть в массиве - выводим на экран
if (!($task.LastTaskResult -in $success_sc_codes)){
$task
}
}
Такой же подход можно использовать при поиске странных сервисов-программ. Например у нас есть эталонный компьютер/сервер и на нем созданы все нужные задачи. Всех их мы помещаем в один объект, а затем сравниваем с другими экземплярами:
# Создаем пустой массив
$good_list = [System.Collections.ArrayList]@()
# Получаем существующие задачи
$all_sc_tasks = Get-ScheduledTask
foreach ($task in $all_sc_tasks){
# Помещаем в созданный массив только имена
$good_list.Add($task.TaskName) > Out-Null
}
Далее, через разные средства, мы можем сравнить этот список на других компьютерах:
# Получаем список на другом компьютере
$all_sc_tasks = Get-ScheduledTask
foreach ($task in $all_sc_tasks){
# Ищем имена, которые не соответствуют тому что есть в массиве
if (!($task.TaskName -in $good_list)){
$task
}
}
…
Теги:
#powershell
Table of Contents
- Introduction
- Case 1: Run the PowerShell script with Windows Task Scheduler Locally.
- Case 2: Run the PowerShell script with Windows Task Scheduler with a Domain Account.
- Conclusion
Introduction
Let us discuss on setting up the Windows Task Scheduler to run the PowerShell scripts. We would discuss on setting up a simple script to run Locally on a system and to have script doing remote execution.
Windows Task Scheduler has wide functionalities and options we would explore the options useful for PowerShell.
Case 1: Run the PowerShell script with Windows Task Scheduler Locally.
Sample code for execution Locally.
Save the code in a file with .ps1 extension in C: to be called by the task scheduler.
1.
#Sample script to test the script execution
from Task Scheduler.
2.
"Ran on System $(hostname) as $([Security.Principal.WindowsIdentity]::GetCurrent().Name)"
`
3.
| Out-File c:scriptLog.log -Force -Append
Setting up the Windows Task Scheduler.
Create a Basic Task
Select the option as appropriate for script execution.
Select the Start Schedule as appropriate
Select «Start a Program«
Set the Program as «Powershell.exe» and the Arguments as «-file <filename>.ps1»
Troubleshooting Tips:
Putting the filename in single quotes here would give a error while executing.
0xFFFD0000
The filename should be in double quotes even if the path has spaces in the
folder names.
ie It should be «C:Program FilesMy DataRun Script.ps1» and not ‘C:Program FilesMy DataRun Script.ps1’
Select «Open the Properties…..» and Click «Finish»
On the new Properties window.
Troubleshooting Tips :
Check the user name — Here its local Administrator or server RDS1. Though the Author of the Script is Domain account.
Ensure «Run whether user is logged on or not» is checked if your script is specific time dependent and not user logon status.
Check «Run with highest privileges» — To ensure the script runs elevated.
Validate the «Trigger» tab.
Validate the «Actions» Tab
Click «OK» and «Enter the Local Administrator Credentials.»
The Task is Scheduled.
Execute the Script
Status of the Task and the output in the Log file.
Troubleshooting Tips:
The task is set to run as Local Administrator.
Find the Execution Policy set on the System.
If the Execution Policy is Restricted, AllSigned as shown below the task would fail with
0x1 error.
If you want to bypass the execution Policy on the system, change the «Action» in the Properties of the Task as below.
Append the «-executionPolicy bypass» and save the Task.
Case 2: Run the PowerShell script with Windows Task Scheduler with a Domain Account.
Things change a bit here, when we plan to run the task scheduler with Domain Account.
Two things to consider.
Case 2 : Option 1.The PowerShell script does all it’s stuff locally when it’s called from the Windows Task Scheduler.
If the Domain Account has the Administrators privileges locally (domain user or the Domain Group if it’s part of Local Administrators Group), the scenario wont change much.
Change the «General» Tab setting for the user by going to the Task Properties.
Output of the Log File and the Task Status. Shows the Domain Account in use.
Once the job is configured to «Run as a Different User» it can be called by users who have Administrator rights.
Output of execution as Local Administrator on the same server.
Troubleshooting Tips:
Logging with local users without administrator privileges won’t allow you to see the Tasks in the Windows Task Scheduler.
Users without the Administrator rights may not be able to modify the tasks in the Windows Task Scheduler.
Case 2 : Option 2.The PowerShell script tries to do something remotely, like winrm, copying data, etc when it’s called from the Windows Task Scheduler.
A domain account with Administrators permissions on the remote servers and if the WinRM is enabled to communicate over. The scenario is simple. Configure the task to run as the account with the permissions on remote systems.
Sample Code: Save as C:RunScript1.ps1
1.
#Sample script to test the script execution
from Task Scheduler
2.
# Calling remote servers with account that
has administrators rights on the resources
3.
get-service -ComputerName domain01,rds1
-Name bits| `
4.
select Status, MachineName| Out-File
c:scriptLog.log -Force -Append
Account used : Domain Account with Administrators rights on the servers.
Output: Able to query both the servers and returns the output.
Troubleshooting Tips:
If we configure local account to fetch the details it would fail, in a very rare case if the domain account name and password match the local account it may execute, probably to do with authentication options.
ie. <Domain>User01 and <Hostname>User01
If you are running batch scripts instead of PowerShell, in addition to the permissions described, we need to ensure the «Allow logon as batch» in security policies.
Conclusion
Tried to cover some basics with common issues.
Reference URL : https://docs.microsoft.com/en-us/dynamics365/business-central/dev-itpro/developer/devenv-task-scheduler
В Windows есть механизм под названием ‘Планировщик заданий’ (Task Scheduler). Основная задача планировщика — выполнение задач в определенный момент времени или при определенном действии. В этой статье будет рассмотрены варианты работы с ним через Powershell. На примере мы создадим задание в виде скрипта с Powershell, изменим и удалим его используя только команды.
Содержимое
-
1 Работа планировщика в Powershell
- 1.1 Создание скрипта для тестирования
- 2 Создание выполняемого действия для планировщика
- 3 Создание временного события — триггера
- 4 Регистрация задачи в планировщике
- 5 Запуск и получение дополнительной информации
-
6 Изменение пользователя, параметров безопасности и уровня запуска
- 6.1 Изменение триггеров и действий
-
7 Бэкап, удаление и восстановление задач планировщика с Powershell
- 7.1 Резервное копирование
- 7.2 Удаление, отключение и включение
- 7.3 Восстановление
- 8 Анализ выполнения и завершения, а так же сравнение
Работа планировщика в Powershell
Отличительной чертой работы Powershell является то, что мы должны создать каждый из объектов (результат команд) планировщика отдельно, а затем объединить их с помощью 1 команды. Сами объекты делятся на следующие:
- Action (Действие) — определяет что мы должны запустить. Действия проявляются как программа (например браузер) с аргументами (открыть определенный сайт). В одной задаче может быть до 32 действий;
- Trigger (Триггер) — это событие при котором должно запуститься действие. Событие может быть привязано к времени или каким-то процессом в системе (включение компьютера, вход пользователя и т.д.). Время можно устанавливать как определенное, например в 14:00, так и интервальное — каждые 2 часа. Так же как и действий триггеров может быть несколько.
- Settings (Настройки) — дополнительные условия обработки задач. Это может быть перезапуск в случае сбоя задачи или самоудаление если задача не используется.
- Security Options (Параметры безопасности) — определяют привилегии и пользователя от имени которого будут запущены задания.
3 и 4 пункт не является обязательными при создании задачи т.к. уже имеет настройки по умолчанию.
За создание задач в планировщике отвечает модуль ScheduledTasks, который имеет следующие команды:
Get—Command —Module ScheduledTasks |
Создание скрипта для тестирования
Что бы продемонстрировать работу планировщика я создам скрипт, который будет сохранять логи с журнала Windows в папку ‘logs’. Ниже находится сам скрипт:
# Папка с логами $log_dir = ‘C:logs’ # Полный путь до файла с генерацией имени файла в виде даты $log_file = $log_dir + «AppLog_$(Get-Date -format ‘dd—mm—yyyy‘).xml» # Получаем 10 последних логов приложений $logs = Get—WinEvent —MaxEvents 10 —LogName application # Сохраняем результат предыдущей команды в файл в формате XML Export—CliXml —InputObject $logs —Path $log_file —Force |
Команды выше не должны выдавать каких либо ошибок. Ошибка может быть, например, с несуществующей папкой ‘logs’. Сам скрипт я сохранил по пути ‘C:scheduler_task.ps1’. Его запуск не выдает каких-то ошибок:
У вас так же будет создан файл в папке ‘logs’.
Создание выполняемого действия для планировщика
Для создания ‘action’ мы должны указать программу и аргументы. В качестве программы будет сам интерпретатор ‘powershell.exe’, а аргументом будет путь до скрипта. Как говорилось раньше у нас будет несколько объектов (результат команд) и все их нужно будет объединить. Что бы это было возможным мы должны поместить результаты работы в переменные:
$task_action = New—ScheduledTaskAction ` —Execute ‘powershell.exe’ ` —Argument ‘-File C:scheduler_task.ps1’ |
Мы так же можем указать параметр ‘WorkingDirectory’, который определяет откуда и будет запущена программа. Учитывая, что ‘powershell.exe’ виден через системные переменные использовать параметр ‘WorkingDirectory’ нам не требуется.
Действия выше аналогичны следующим настройкам в интерфейсе (т.е. так мы обычно добавляем скрипт Powershell в планировщик):
Создание временного события — триггера
Следующим мы определим, когда мы будем запускать задачу. Это делается с помощью команды ‘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:
$task_trigger = New—ScheduledTaskTrigger —Once —At 13:00 |
Еще несколько примеров:
# Ежедневно в 14:00 New—ScheduledTaskTrigger —Daily —At 14:00 # Запуск каждые 2 дня в 14:00 New—ScheduledTaskTrigger —Daily —DaysInterval 2 —At 14:00 # Каждый 2-ой понедельник в 14:00 New—ScheduledTaskTrigger —Weekly —WeeksInterval 2 —DaysOfWeek Monday —At 14:00 |
Меня интересует ежедневный запуск задачи с периодичностью в 5 минут. Для ‘RepetitionInterval’, который устанавливает такие интервалы, нужно использовать дополнительную команду ‘New-TimeSpan’. В этой команде определим сам интервал:
$time = New—TimeSpan —Minutes 5 $task_trigger = New—ScheduledTaskTrigger —Once —At 0:00 —RepetitionInterval $time |
Регистрация задачи в планировщике
Теперь, после выполнения минимальных требований в виде ‘action’ и ‘trigger’, мы должны объединить эти объекты. Это делается с помощью команды ‘Register-ScheduledTask’. Дополнительно мы можем определить название и описание создаваемого объекта:
$name = ‘Сбор логов’ $description = ‘Сбор логов приложений каждые 5 минут в папку c:logs’ Register—ScheduledTask —TaskName $name ` —Description $description ` —Action $task_action ` —Trigger $task_trigger |
Учитывайте, что вы можете использовать несколько триггеров и действий. Для этого вы должны перечислить их через запятую.
TaskPath указывает где была создана задача. В примере выше это произошло в корне планировщика:
Вы можете использовать аналогичный параметр для регистрации задачи в другой директории:
Register—ScheduledTask —TaskName ‘SomeTask’ ` —TaskPath ‘Microsoft’ ` —Action $action1,$action2 ` —Trigger $trigger1,$trigger2 |
Способа узнать путь два:
- Через графический интерфейс;
- Через команду ‘Get-ScheduledTask’ (будет рассмотрена ниже).
В powershell есть еще одна команда, которая может участвовать в создании задач «New-ScheduledTask». Основное отличие такой команды в том, она не регистрирует (добавляет) задачу в сервис планировщика. Если бы мы использовали обе команды это бы выглядело так:
# Объединение объектов $task = New—ScheduledTask —Action $action1,$action2 ` —Trigger $trigger1,$trigger2 # Их активация Register—ScheduledTask —TaskName ‘SomeTask’ ` —TaskPath ‘Microsoft’ ` —InputObject $task |
Запуск и получение дополнительной информации
Для запуска задачи, не зависимо от триггеров, используется команда ‘Start-ScheduledTask’:
Start—ScheduledTask —TaskName ‘Сбор логов’ |
У нас так же есть 2 команды, которые возвращают информацию о задачах.
Первая команда просто возвращает список задач, которые есть в каталогах планировщика их статус и путь:
У команды запуска и получения задач из планировщика можно использовать параметры:
- TaskName — имя объекта;
- TaskPath — путь до объекта.
Get—ScheduledTask —TaskPath ‘‘ |
Более полезная команда следующая, так как вернет немного больше информации:
Get—ScheduledTaskInfo —TaskName ‘Сбор логов’ |
Само собой все эти команды можно использовать в конвейере:
Get—ScheduledTask —TaskName ‘Сбор логов’ | Start—ScheduledTask |
Если задача занимает много времени и ее нужно остановить — можно выполнить следующие действия:
Stop—ScheduledTask ‘Сбор логов’ |
Изменение пользователя, параметров безопасности и уровня запуска
Создавая задачи в планировщике мы имеем блок ‘Security Options’, который чаще используется с настройками по умолчанию. В этом блоке определяются следующие параметры:
- Пользователь, от имени которого будет выполнен запуск;
- Выполняется ли задача для вошедших в систему пользователей;
- Привилегии запуска (от пользователя/администратора);
- Совместимость.
В графическом интерфейсе эти параметры настраиваются в следующем блоке:
Так же как и в случае с созданием задачи, в случае ее изменения мы создаем разные объекты (результаты команд), которые затем привязываем через команду ‘Set-SchedukedTask’.
С помощью следующих команд мы изменим пользователя, повысим права и изменим совместимость:
# Изменяем пользователя и повышаем права запуска $task_user = New—ScheduledTaskPrincipal —UserId ‘.admin’ —RunLevel Highest # Изменяем совместимость $task_settings = New—ScheduledTaskSettingsSet —Compatibility ‘Win8’ # Добавляем объекты созданные выше к существующей задаче Set—ScheduledTask —TaskName ‘Сбор логов’ —Principal $task_user —Settings $task_settings |
Если у вас будет следующая ошибка, то скорее всего она связана с неверным пользователем:
- Set-ScheduledTask : No mapping between account names and security IDs was done.
Само собой эти же объекты можно использовать при создании (регистрации) задачи в планировщике:
$name = ‘Task 3’ Register—ScheduledTask —TaskName $name ` —Action $task_action ` —Trigger $task_trigger ` —Principal $task_user ` —Settings $task_settings |
Учитывайте, что у New-ScheduledTaskSettingsSet около 30 возможных параметров (работа при отключенной батареи, максимальное количество перезапусков и т.д.). В примере выше рассмотрено лишь несколько.
Изменение триггеров и действий
С помощью Set-ScheduledTask так же добавляются и изменяются триггеры и действия. Изменение будут заключаться в полной замене существующих триггеров и действий у задач. Вам просто нужно создать объект по аналогии с тем, как это делалось в предыдущих разделах:
$trigger = New—ScheduledTaskTrigger —Daily —At 14:00 $action = New—ScheduledTaskAction —Execute Calc.exe Set—ScheduledTask —TaskName ‘Сбор логов’ —Action $action —trigger $trigger |
Бэкап, удаление и восстановление задач планировщика с Powershell
Удобной возможностью использования Powershell является импорт и экспорт задач планировщика. По сути вы можете создать шаблон, который можно использовать на разных компьютерах без особой работы с кодом. По умолчанию, сам Powershell, не предоставляет прямой возможности бэкапа и восстановления, но это можно сделать через другие команды.
Резервное копирование
Для бэкапа мы можем использовать команду Export-CliXml. Для этого нам нужно будет получить задачу и использовать конвейер:
Get—ScheduledTask —TaskName ‘Сбор логов’ | Export—Clixml ‘C:LogTaskBackup.xml’ |
Для экспорта в Powershell так же есть ‘Export-ScheduledTask’, но нет аналогичной команды импорта. Что бы импортировать такие файлы-задачи мы можем использовать только GUI. Из-за этого она не приведена в примере выше.
Удаление, отключение и включение
При удалении задачи, по умолчанию, запрашивается подтверждение. Что бы этого не было добавляется ключ ‘Confirm’:
Unregister—ScheduledTask —TaskName ‘Сбор логов’ —Confirm:$False |
Если требуется только отключить задачу используйте Disable:
Disable—ScheduledTask —TaskName ‘Сбор логов’ |
Включение:
Enable—ScheduledTask —TaskName ‘Сбор логов’ |
Восстановление
Восстановление выполняется в несколько шагов. Первое — мы должны выполнить импорт XML документа в Powershell:
$task = Import—Clixml —Path ‘C:LogTaskBackup.xml’ |
На одном из сайтов я прочитал, что следующий параметр нужно изменять на «Interactive», так как без него не будет работать задача, но у меня этот параметр не изменялся при экспорте:
Этот параметр связан со входом пользователя через GUI. Аналогичное название в интерфейсе планировщика задач «Выполнять только для пользователей, вошедших в систему». Если этот параметр у вас отличается — вы сможете изменить его так:
$task.Principal.LogonType = ‘Interactive’ |
Далее нам нужно зарегистрировать эту задачу определяя каждый из параметров отдельно:
Register—ScheduledTask ` —TaskName $task.TaskName ` —Action $task.Actions ` —Trigger $task.Triggers ` —Settings $task.Settings ` —Principal $task.Principal ` —User ‘administrator’ ` —Password ‘123’ |
Анализ выполнения и завершения, а так же сравнение
Используя предыдущие команды мы можем выполнить некоторую автоматизацию. Например так мы можем увидеть результат выполненных задач:
Get—ScheduledTask | Get—ScheduledTaskInfo | select * |
Часть этих кодов имеет следующую расшифровку (был использован автоматический переводчик):
- 0 — операция успешно завершена.
- 1 — Вызывается неправильная функция или неизвестная функция. 2 Файл не найден.
- 10 — Неправильная среда.
- 267008 — Задача готова к запуску в следующее запланированное время.
- 267009 — В данный момент идет выполнение.
- 267010 — Задача не будет запущена в запланированное время, потому что она отключена.
- 267011 — Запуск еще не был выполнен.
- 267012 — Для этой задачи больше нет запланированных запусков.
- 267013 — Одно или несколько свойств, необходимых для запуска этой задачи по расписанию, не были установлены.
- 267014 — Последний запуск задачи был прерван пользователем.
- 267015 — Либо у задачи нет триггеров, либо существующие триггеры отключены или не установлены.
- 2147750671 — Учетные данные повреждены.
- 2147750687 — Экземпляр этой задачи уже запущен.
- 2147943645 — Служба недоступна (установлен ли флажок «Запускать только при входе пользователя в систему»?).
- 3221225786 — Приложение было закрыто в результате нажатия CTRL + C.
- 3228369022 — Неизвестное программное исключение.
Альтернативное — вы можете открыть интерфейс планировщика и посмотреть какая ошибка отображается там (она будет текстом).
Далее вы можете создать скрипт для поиска сбойных задач. Например меня интересует только задачи со сбоями, а не успешно работающие. Так как я не знаю всех кодов, мне нужно будет исключить только коды успешного выполнения:
# Коды, которые меня не интересуют (успешное выполнение) $success_sc_codes = @(0, 267008, 267009, 267010, 267011, 267012) # Получает объект, который содержит детальную информацию по всем процессам $all_sc_tasks = Get—ScheduledTask | Get—ScheduledTaskInfo foreach ($task in $all_sc_tasks){ # Если код не соответствует тому что есть в массиве — выводим на экран if (!($task.LastTaskResult —in $success_sc_codes)){ $task } } |
Такой же подход можно использовать при поиске странных сервисов-программ. Например у нас есть эталонный компьютер/сервер и на нем созданы все нужные задачи. Всех их мы помещаем в один объект, а затем сравниваем с другими экземплярами:
# Создаем пустой массив $good_list = [System.Collections.ArrayList]@() # Получаем существующие задачи $all_sc_tasks = Get—ScheduledTask foreach ($task in $all_sc_tasks){ # Помещаем в созданный массив только имена $good_list.Add($task.TaskName) > Out—Null } |
Далее, через разные средства, мы можем сравнить этот список на других компьютерах:
# Получаем список на другом компьютере $all_sc_tasks = Get—ScheduledTask foreach ($task in $all_sc_tasks){ # Ищем имена, которые не соответствуют тому что есть в массиве if (!($task.TaskName —in $good_list)){ $task } } |
Часто, когда вы хотите запланировать некоторые повторяющиеся задачи в Windows, вы обычно сначала обращаетесь к утилите Windows Task Scheduler. Однако можно использовать командлеты PowerShell для создания, изменения и удаления запланированных задач.
Но почему вы должны использовать PowerShell для планирования задач вместо уже выделенного планировщика заданий? Давай выясним. Проверять Лучшие альтернативы планировщику задач в Windows.
Для большинства пользователей Windows проще использовать встроенный планировщик заданий для создания простых запланированных задач. Однако основной причиной использования PowerShell вместо планировщика заданий является возможность создать скрипт, взаимодействующий с системой через запланированное задание.
Планировщик заданий долгое время был частью Windows, и вы можете узнать больше о Запускать приложения автоматически используя их в нашем руководстве. Это поможет вам определить лучший способ создания запланированных задач для ваших конкретных потребностей.
Что такое PowerShell?
Windows PowerShell — это приложение для управления конфигурацией и автоматизации задач. Также включает язык сценариев. Сценарии PowerShell, называемые командлетами, позволяют создавать сложные процессы с несколькими действиями.
Сценарий PowerShell можно использовать для таких простых вещей, как сбор и представление информации о вашем компьютере. Сетевой администратор может создать сценарий, который выключит каждый компьютер в неиспользуемой сети.
Сценарии обычно используются как системными, так и сетевыми администраторами, но это не означает, что вы не можете создавать сценарии PowerShell для выполнения простых и сложных действий на вашем компьютере. На самом деле существует множество простых Windows-скриптов, которые несложно настроить, но при этом предоставляют большой функционал.
Создайте запланированную задачу в PowerShell (права администратора)
Вам нужно будет открыть PowerShell с правами администратора, если вы хотите создать запланированные задачи. Если вы не знаете, как это сделать, обязательно узнайте больше о Как открыть PowerShell.
Чтобы открыть PowerShell, щелкните правой кнопкой мыши кнопку меню «Пуск» и выберите PowerShell (администратор) из списка ссылок. Если вы не видите эту опцию, найдите PowerShell в поиске Windows и выберите Запустить от имени администратора.
Вам нужно создать переменную для хранения действия задачи. Для этого введите следующую команду и нажмите Enter:
$action = New-ScheduledTaskAction -Execute ‘PROGRAM’
Замените PROGRAM на имя приложения, для которого вы создаете задачу.
Имя переменной в приведенной выше команде является частью $ действие. Вы можете изменить его на что угодно, но лучше сделать его кратким и описательным. Он также должен быть в нижнем регистре.
Затем создайте триггер для запланированной задачи. Это потребует времени и повторения. Чтобы добавить триггер, введите следующую команду:
$trigger = New-ScheduledTaskTrigger -SETTING -At TIME
заменять -ПАРАМЕТР С частотой повторения, например Daily. заменять -Вовремя Со временем, например «7 утра».
вы можете использовать Как только ، ежедневно ، еженедельно или же ежемесячно для частоты. Время может быть в 12- или 24-часовом формате. Если вы используете частоту еженедельно, вы также можете добавить -Дни недели , то сегодня. Понедельник, например. Вы также можете использовать -DaysInterval для контроля частоты. Например , -DaysInterval3 Задание будет выполняться каждые три дня.
Теперь вам нужно объединить всю информацию в одну команду. В следующей командной строке замените ПАПКА ЗАДАЧ و НАЗВАНИЕ ЗАДАЧИ و ДОПОЛНИТЕЛЬНЫЙ ОПИСАНИЕ-ТЕКСТ с информацией о вашей работе. Подготовить -Путь к задаче Необязательно, но это поможет вам выбрать созданные задачи.
Чтобы создать запланированное задание, введите следующую команду и нажмите Enter:
Register-ScheduledTask -Action $action -Trigger $trigger -TaskPath “TASK-FOLDER” -TaskName “TASK-NAME” -Description “OPTIONAL-DESCRIPTION-TEXT”
Затем будет создана запланированная задача, которая активируется при достижении триггеров частоты и времени.
Изменить запланированную задачу в PowerShell (права администратора)
Вы также можете использовать PowerShell для изменения ранее созданного запланированного задания. Вы можете редактировать запланированную задачу, даже если она в данный момент активна. Вам нужно будет знать имя запланированной задачи и путь к задаче.
Откройте PowerShell с правами администратора, выполнив поиск Windows и щелкнув Запустить от имени администратора.
Вам нужно создать переменную для хранения запланированных изменений задачи. Введите следующую команду:
$trigger = New-ScheduledTaskTrigger -SETTING -At TIME
ты можешь измениться -ПАРАМЕТР و -Вовремя для частоты и времени, которое вы хотите назначить задаче.
Чтобы изменить приложение, которое использует запланированная задача, введите следующее:
$action = New-ScheduledTaskAction -Execute ‘PROGRAM’
заменять ПРОГРАММА В команде с названием приложения, которое вы хотите использовать, укажите путь к файлу .exe.
Затем примените эти изменения к запланированной задаче, набрав:
Set-ScheduledTask -Trigger $trigger -Action $action -TaskPath “TASK-FOLDER” -TaskName “TASK-NAME”
заменять ПАПКА ЗАДАЧ و НАЗВАНИЕ ЗАДАЧИ Подробная информация о задаче, которую вы хотите изменить. Проверять Полезные инструменты администрирования Windows и как их использовать.
Как удалить запланированные задачи в PowerShell
Запланированные задачи, созданные в PowerShell, также можно удалить.
Откройте PowerShell (права администратора) и введите следующую команду, чтобы подтвердить существование задачи:
Get-ScheduledTask -TaskName “TASK-NAME”
.заменять НАЗВАНИЕ ЗАДАЧИ Название задачи, которую вы хотите удалить.
Предполагая, что запланированная задача существует, вы можете удалить ее с помощью следующей команды:
Unregister-ScheduledTask -TaskName “TASK-NAME” -Confirm:$false
заменять НАЗВАНИЕ ЗАДАЧИ Название задачи, которую вы хотите удалить.
Чтобы подтвердить удаление задачи, введите следующую команду:
Get-ScheduledTask -TaskName “TASK-NAME”
с заменой НАЗВАНИЕ ЗАДАЧИ Имя запланированной задачи, которую вы удалили.
После этого вы должны увидеть предупреждение о том, что задачи с таким именем нет. Если вы видите детали запланированной задачи, которая была запрошена, это означает, что она была удалена неправильно. Проверьте данные, которые вы ввели на шаге 1 выше. Проверять Как запускать автоматические команды при запуске командной строки / Powershell.
Командлеты PowerShell для запланированных задач
Теперь, когда вы понимаете основы создания запланированных задач в PowerShell, вы можете попробовать другие командлеты.
Есть несколько других способов управлять запланированными задачами с помощью командной строки. Это включает в себя временное отключение задач, экспорт запланированной задачи в виде строки XML и остановку всех запущенных задач.
Вы можете найти полный список всех командлетов для запланированных задач PowerShell в Microsoft. Docs.
Создание запланированных задач в Windows PowerShell
Не всем нужно будет использовать PowerShell для создания запланированных задач. Планировщик заданий позволяет планировать простые задачи, такие как открытие приложений. Но если вам нужно научиться создавать запланированные задачи в PowerShell, мощном инструменте автоматизации Windows, это руководство — отличное начало. Теперь вы можете просмотреть Лучшие приложения, которые помогут вам автоматизировать повторяющиеся задачи.
Microsoft Windows Task Scheduler can help you automatically launch a program or PowerShell script at a certain time or when certain conditions are met. You can also schedule sending emails and even displaying certain messages. In this blog, we will show you how to run a PowerShell script from Task Scheduler that will alert on any software installation on a local computer.
We will also create scheduled tasks using PowerShell scripts. You will learn how to:
- Create Tasks with Task Scheduler
- Modify or Delete Scheduled Tasks
- Create Scheduled Tasks with PowerShell Scripts.
Creating Tasks with Task Scheduler
Open Task Scheduler by pressing “Windows+R” and then typing “taskschd.msc” in the window that opens. Then take the following steps:
1. Click “Create a task” and enter a name and description for the new task. To run the program with administrator privileges, check the “Run with the highest privileges” box. In our example, we’ll assign a service account to run the task, and run it regardless of whether the user is logged on.
2. Switch to the Triggers tab and click the “New…” button. Here you can specify the conditions that trigger the task to be executed. For example, you can have it executed on schedule, at logon, on idle, at startup or whenever a particular event occurs. We want our task to be triggered by any new software installation, so we choose “On an event” from the drop-down menu and select “Application” from the Log settings. Leave the “Source” parameter blank and set the EventID to “11707”. Click “OK” to save the changes.
3. Navigate to the “Actions” tab, and click “New…”. Here you can specify the actions that will be executed whenever the trigger conditions are met. For instance, you can send an email or display a message. In our case, we want to start a program, so we need to create the PowerShell script we want to run and save it with the “ps1” extension. You can find the script here; it will send an alert with the event details about the installed software.
To schedule the PowerShell script, specify the following parameters:
- Action: Start a program
- Programscript: powershell
- Add arguments (optional): -File [Specify the file path to the script here]
Click “OK” to save your changes.
4. The “Conditions” tab enables you to specify the conditions that, along with the trigger, determine whether the task should be run. In our case, we should leave the default settings on this tab.
5. You can also set up additional parameters for your scheduled task on the “Settings” tab. For our example, though, we’ll leave them unchanged.
6. When the task is completely set up, the system will ask you for the service account password. Note that this account must have the “Log on as Batch Job” right. Enter the password and click “OK” to save the task.
7. For Task Scheduler to function properly, the Job Scheduler service must be set to start Run “Services.msc”. In the list of services, find Task Scheduler and double-click it. On the General tab, set the startup type to “Automatic” and click OK to save your change.
Now whenever new software is installed on your Microsoft Windows Server, you will be notified via an email that details the time of the installation, the name of the software and the user ID (SID) of the person who installed it.
Modifying or Deleting Scheduled Tasks
To modify an existing task, right-click it in the list, select Properties, edit the required settings and click OK. To delete a scheduled task, right-click it, select Delete and confirm the action.
Creating Scheduled Tasks with PowerShell Scripts
Now that you know how to create a task using Task Scheduler, let’s find out how to create a scheduled task using PowerShell. Suppose we want our task to be launched daily at 10 AM, and it must execute the PowerShell script you can find here, which will monitor changes to group membership in the Active Directory site.
In Windows Powershell 2.0 (Windows 7, Windows Server 2008 R2), to create a scheduled job, you must use the TaskScheduler module. Install the module by running the “Import-Module TaskScheduler” command and use the following script to create a task that will execute the PowerShell script named GroupMembershipChanges.ps1 daily at 10 AM:
Import-Module TaskScheduler $task = New-Task $task.Settings.Hidden = $true Add-TaskAction -Task $task -Path C:Windowssystem32WindowsPowerShellv1.0powershell.exe –Arguments “-File C:ScriptsGroupMembershipChanges.ps1” Add-TaskTrigger -Task $task -Daily -At “10:00” Register-ScheduledJob –Name ”Monitor Group Management” -Task $task
Windows PowerShell 4.0 (Windows Server 2012 R2 and above) doesn’t include the Task Scheduler module, so this script will not work. Instead, PowerShell 3.0 and 4.0 introduced new cmdlets for creating scheduled tasks, New-ScheduledTaskTrigger and Register-ScheduledTask, which make creating a scheduled task much easier and more convenient. So let’s create a task that will execute our script daily at 10 AM using the system account (SYSTEM). This task will be performed by an account with elevated privileges.
$Trigger= New-ScheduledTaskTrigger -At 10:00am –Daily # Specify the trigger settings $User= "NT AUTHORITYSYSTEM" # Specify the account to run the script $Action= New-ScheduledTaskAction -Execute "PowerShell.exe" -Argument "C:PSStartupScript.ps1" # Specify what program to run and with its parameters Register-ScheduledTask -TaskName "MonitorGroupMembership" -Trigger $Trigger -User $User -Action $Action -RunLevel Highest –Force # Specify the name of the task
Other trigger options that could be useful in creating new tasks include:
- -AtStartup — Triggers your task at Windows startup.
- -AtLogon — Triggers your task when the user signs in.
- -Once — Triggers your task once. You can set a repetition interval using the –RepetitionInterval parameter.
- -Weekly — Triggers your task once a week.
Note that, using these cmdlets, it is not possible to trigger execution “on an event” as we did with the Task Scheduler tool. PowerShell scripts with “on an event” triggers are much more complicated, so this is a real disadvantage of using PowerShell rather than Task Scheduler.
Conclusion
As you can see, it is easy to create scheduled tasks using Task Scheduler or PowerShell. But remember that improper changes to your scheduled tasks can cause service interruptions and degrade server performance. Therefore, it’s essential to track all changes to your scheduled tasks.
Jeff is a former Director of Global Solutions Engineering at Netwrix. He is a long-time Netwrix blogger, speaker, and presenter. In the Netwrix blog, Jeff shares lifehacks, tips and tricks that can dramatically improve your system administration experience.