Для управления повторяющимися заданиями планировщика Windows Task Scheduler вместо графической оснастки
taskschd.msc
или устаревшей консольной утилиты
schtasks.exe
можно использовать возможности PowerShell. В этой статье мы рассмотрим, как с помощью PowerShell создавать, редактировать, удалять и запускать задания планировщика в Windows.
В современных версиях Windows для управления задачами планировщике доступен встроенный PowerShell модуль ScheduledTasks. Список командлетов в модуле можно вывести так:
Get-Command -Module ScheduledTasks
Как создать новое задание в планировщике с помощью PowerShell?
Рассмотрим, как из консоли PowerShell создать новое задание планировщика. Предположим, вы хотите создать в планировщике задание, которое должно запускаться при загрузке компьютера (или в определенное время) и выполнять какой-то PowerShell скрипт. При создании нового задания нужно указать как минимум следующие его параметры:
- Action – действие, которое выполняет задание (запустить команду, программу, скрипт). Для создания объекта используется командлет New-ScheduledTaskAction
- Trigger – определяет, когда нужно выполнить задание (по определенному расписанию или при наступлении события): New-ScheduledTaskTrigger
- Principal – учетная запись, из под которое выполняется задание: New-ScheduledTaskPrincipal
Сначала нужно указать имя задания:
$NewTaskName = "StartupScript_PS"
Укажем пользователя, из под-которого нужно запускать задание (в этом примере мы будем запускать скрипт с правами учетной записи SYSTEM).
$User="NT AUTHORITY\SYSTEM"
$User = "winitpro\adm"
Для запуска задания от пользователя его учетная запись должна быть добавлена в локальную политику «Log on as a batch job».
Можно запускать задания от имени сервисных учетных записей AD (gMSA):
$svcUserPrincipal = New-ScheduledTaskPrincipal -UserID winitpro\sql01$ -LogonType Password
Далее с помощью New-ScheduledTaskTrigger нужно создать триггер, определяющий время запуска задания. Здесь можно использовать системные события:
-
AtLogOn
— при входе пользователя в систему -
AtStartup
— во время загрузки компьютера
Или указать время:
-
Once
– запустить задание однократно -
At
– задать точное время выполнения -
Daily
– ежедневно -
DaysOfWeek
– в определенные дни недели -
Weekly
— запуск в определенные недели месяца -
WeeksInterval
— интервал между неделями
Например, чтобы запускать задачу по расписанию ежедневно в 10:00:
$Trigger = New-ScheduledTaskTrigger -At 10:00am -Daily
- Запускать при каждой загрузке компьютера:
$Trigger = New-ScheduledTaskTrigger -AtStartup
- Выполнять при входе пользователя:
$Trigger = New-ScheduledTaskTrigger –AtLogon
- Однократный запуск в указанное время:
$Trigger= New-ScheduledTaskTrigger -Once -At 13:00
- Каждый второй вторник:
$Trigger = New-ScheduledTaskTrigger -Weekly -WeeksInterval 2 -DaysOfWeek Tuesday -At 13:00
Указываем, что должно делать наше задание (в данном случае нужно запустить указанный PowerShell скрипт):
$Action= New-ScheduledTaskAction -Execute "PowerShell.exe" -Argument "-NoProfile -NoLogo -NonInteractive -ExecutionPolicy Bypass -File C:\PS\StartupScript.ps1"
-Bypass
позволяет запускать PowerShell скрипт по расписанию из планировщика не зависимо от настроек PowerShell Execution PolicyТеперь можно создать задание с указанными настройками:
Register-ScheduledTask -TaskName $NewTaskName -Trigger $Trigger -User $User -Action $Action -RunLevel Highest –Force
Если задание успешно создано, появится надпись Ready.
Откройте консоль
Taskschd.msc
и проверьте, что в Task Scheduler Library появилось новое задание планировщика.
$TaskName = "NewPsTask"
$TaskDescription = "Запуск скрипта PowerShell из планировщика"
$TaskCommand = "c:\windows\system32\WindowsPowerShell\v1.0\powershell.exe"
$TaskScript = "C:\PS\StartupScript.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
Чтобы изменить настройки существующего задания планировщика, используется командлет Set-ScheduledTask.
Изменить время запуска (добавить несколько триггеров), изменить выполняемое действие:
$Trigger1 = New-ScheduledTaskTrigger -At 12:00 -Weekly -DaysOfWeek Monday
$Trigger2= New-ScheduledTaskTrigger -At 12:00 -Weekly -DaysOfWeek Friday
$action = New-ScheduledTaskAction -Execute "Calc.exe"
Set-ScheduledTask -TaskName StartupScript_PS -Trigger $trigger1, $trigger2 -Action $action
Изменить имя пользователя, из-под которого запускается задание и, например, режим совместимости:
$task_user = New-ScheduledTaskPrincipal -UserId 'winitpro\kbuldogov' -RunLevel Highest
$task_settings = New-ScheduledTaskSettingsSet -Compatibility 'Win8'
Set-ScheduledTask -TaskName StartupScript_PS -Principal $task_user -Settings $task_settings
Управление заданиями планировщика из PowerShell
Вы можете вывести список всех активных заданий планировщика в Windows с помощью команды:
Get-ScheduledTask -TaskPath | ? state -ne Disabled
Команда выведет время предыдущего запуска задания (и код ошибки) и время следующего запуска.
Get-ScheduledTask CheckServiceState_PS| Get-ScheduledTaskInfo
LastRunTime : 4/6/2025 10:00:00 AM LastTaskResult : 267011 NextRunTime : 4/7/2025 10:00:00 AM NumberOfMissedRuns : 0 TaskName : CheckServiceState_PS TaskPath : \ PSComputerName :
Вывести полный список параметров задания:
$task = Get-ScheduledTask StartupScript_PS
$task.Settings
Вы можете отключить это задание:
Get-ScheduledTask CheckServiceState_PS | Disable-ScheduledTask
Чтобы включить задание:
Get-ScheduledTask CheckServiceState_PS | Enable-ScheduledTask
Чтобы запустить задание немедленно (не дожидаясь расписания):
Start-ScheduledTask CheckServiceState_PS
Чтобы полностью удалить задание из Task Scheduler:
Unregister-ScheduledTask -TaskName CheckServiceState_PS
Экспорт и импорт заданий планировщика в XML файл
С помощью PowerShell можно экспортировать настройки заданий планировщика в текстовый XML файл (это удобно, когда нужно скопировать настроенные задания на другие компьютеры, или создать резевную копию).
Следующая команда экспортирует задание StartupScript_PS в файл StartupScript_PS.xml:
Export-ScheduledTask "StartupScript_PS" | out-file c:\temp\StartupScript_PS.xml
Чтобы импортировать это задание на другом компьютере, укажите путь к полученному XML файле в параметрах командлета Register-ScheduledTask:
Register-ScheduledTask -Xml (Get-Content “\\Server1\public\NewPsTask.xml” | out-string) -TaskName "NewPsTask"
Импортировать параметры задания и зарегистрировать его поможет командлет Register-ScheduledTask.
Register-ScheduledTask -Xml (Get-Content “\\Server1\public\NewPsTask.xml” | out-string) -TaskName «NewPsTask»
Здравствуйте! Подскажите можно в планировщику задания настроит скрипт так что б он не спрашивал логин и пароль пользователя, а отрабатывал от него. У меня скрипт должен пускать пользователя на onedrive без дополнительного ввода логина и пароля
Здесь наверно лучше использовать что-то типа логон скриптов, которые запускаются от пользователя при входе.
Сложно будет создать задание планировщика от конкретного пользователя без пароля. У меня последний раз получился конкретный костыль.
Поделитесь пож.
Сейчас уже и не вспомню где это было.
Навскидку можно через GPP запускать задания планировщика от пользователя: User Configuration -> Preferences -> Control Panel Settings -> Scheduled Tasks -> New -> Scheduled Task (Windows
Vista or later).
Направьте на путь истинный: Формирую скриптом Excel таблицу со списком пользователей из AD. В шедулере если выбираю «только для вошедших в систему» все ОК, но если без входа в систему скрипт как-то частично выполнятся, процесс экселя появляется, но файл не формируется. Хотелось бы сделать, чтобы список сотрудников обновлялся скажем раз в сутки без привязки к логону пользователя.
Подскажите, а как в скрипте указать выполнение задания с наивысшими правами и указать выполнение от имени другой УЗ?
Спасибо
Нашел, спасибо )))
Отличная статья!
Подскажите пожалуйста, как мне написать запрос на PowerShell, чтобы задание выполнялось каждую вторую субботу месяца ?
Если созданное задание выгрузить в xml, то там видны параметры для определения, но в командлете я их не нашел.
Благодарю за внимание!
2021-08-04T12:00:00+03:00
true
2
4
Приветствую! Подскажите как правильно прописать LogonUser вместо NT AUTHORITY\SYSTEM в этом месте?
$Trigger= New-ScheduledTaskTrigger -At 10:00am -Daily
$User= «NT AUTHORITY\SYSTEM»
$Action= New-ScheduledTaskAction -Execute «PowerShell.exe» -Argument «C:\PS\StartupScript.ps1»
Register-ScheduledTask -TaskName «StartupScript_PS» -Trigger $Trigger -User $User -Action $Action -RunLevel Highest –Force
Видимо вам нужно такое:
$User=$env:UserDomain + "\" + $env:UserName
Теперь в задаче «При выполнении задачи использовать следующую учетную запись пользователя» стоит
«TESTVM01$» Это имя ПК без $.
Задача создалась, но не запускается. Если изменить в задаче пользователя на текущего, задача успешно
запускается и все ее условия выполняются.
$User=$env:UserDomain + «\» + $env:UserName — эта команда подставила имя ПК а не текущего пользователя.
Нам надо что то вроде этого «%LogonDomain%\%LogonUser%». Только это не воспринимается как
пользователь )
Так вы от кого скрипт запускаете? если это стартап скрипт, который запускается от имени компьютера, он туда и подставит TESTVM01$
Верно. Стартап скрипт. Почему он тогда задачу создает, но запускаться она не хочет? Как бы туда подставить текущего пользователя?
А, если запускать его как логон скрипт? В этом случае он будет запускаться от текущего пользователя и получит правильные значения из переменных окружения.
Либо как вариннт — раскатить задание планировщика через GPO
Там можно использовать синтаксис
%LogonDomain%\%LogonUser%
https://winitpro.ru/index.php/2022/05/11/zadanie-planirovshhika-gpo/