Запланированная задача с ежедневным триггером и интервалом повторения

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

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

#Credentials to run task as
$username = "$env:USERDOMAIN\$env:USERNAME" #current user
$password = "notmypass"

#Location of Scripts:
$psscript = "C:\test\test.ps1"
$Sourcedir ="C:\testsource\"
$destdir = "C:\testdest\"
$archivepassword = "notmypass"


####### Create New Scheduled Task
$action = New-ScheduledTaskAction -Execute "Powershell" -Argument "-WindowStyle Hidden '"$psscript ''$sourcedir'' ''$destdir'' ''$archivepassword'''""
$trigger = New-ScheduledTaskTrigger -Once -At 7am -RepetitionDuration  (New-TimeSpan -Days 1)  -RepetitionInterval  (New-TimeSpan -Minutes 30)
$settings = New-ScheduledTaskSettingsSet -Hidden -AllowStartIfOnBatteries -DontStopIfGoingOnBatteries -StartWhenAvailable -RunOnlyIfNetworkAvailable
$ST = New-ScheduledTask -Action $action -Trigger $trigger -Settings $settings
Register-ScheduledTask EncryptSyncTEST -InputObject $ST -User $username -Password $password

Если я изменил -Once на -Daily я потеряю флаги -RepetitionInterval. И если я вернусь, чтобы обновить задачу до ежедневной регистрации, она вытирает повторяющийся триггер.

Это не необычный метод планирования и легко применяется через пользовательский интерфейс планировщика задач. Я чувствую, что это, вероятно, просто, но я этого не хватает.

Любая помощь приветствуется.

EDIT: обращение к дублирующему вопросу. Вопрос в публикации " Powershell v3 New-JobTrigger ежедневно с повторением " задает то же самое. Но, как я уже отмечал ранее, ни один из ответов не решает проблему. Отмеченный ответ делает именно то, что у меня уже есть, он задает задачу с помощью триггера -Once, а затем обновляет его, чтобы повторять каждые 5 минут в течение 1 дня. После первого дня эта задача никогда не будет запущена снова. Он не решает проблему запуска задачи каждый день с повторением и продолжительностью до следующего триггера.

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

Примечание. Я нашел обходной путь, но не отличный. В настоящее время кажется, что самый простой способ определить пользовательские триггеры с помощью powershell - манипулировать XML-расписанием заданий и импортировать его напрямую, используя Register-ScheduledTask

Ответы

Ответ 1

Я уверен, что должен быть лучший способ, но это мое текущее решение.

Я создал задачу с помощью триггеров, которые я хотел, затем захватил созданный XML.

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

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

#Credentials to run task as
$username = "$env:USERDOMAIN\$env:USERNAME" #current user
$password = "notmypass"

#Location of Scripts:
$psscript = "C:\test\test.ps1"
$Sourcedir ="C:\testsource\"
$destdir = "C:\testdest\"
$archivepassword = "notmypass"

####### Create New Scheduled Task
$action = New-ScheduledTaskAction -Execute "Powershell" -Argument "-WindowStyle Hidden '$EncryptSync' '$sourcedir' '$destdir' '$archivepassword'"
$trigger = New-ScheduledTaskTrigger -Once -At 7am -RepetitionDuration  (New-TimeSpan -Days 1)  -RepetitionInterval  (New-TimeSpan -Minutes 30)
$settings = New-ScheduledTaskSettingsSet -Hidden -AllowStartIfOnBatteries -DontStopIfGoingOnBatteries -StartWhenAvailable -RunOnlyIfNetworkAvailable
$ST = New-ScheduledTask -Action $action -Trigger $trigger -Settings $settings
Register-ScheduledTask "EncryptSyncTEST" -InputObject $ST -User $username -Password $password


[xml]$EncryptSyncST = Export-ScheduledTask "EncryptSyncTEST"
$UpdatedXML = [xml]'<CalendarTrigger xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task"><Repetition><Interval>PT30M</Interval><Duration>P1D</Duration><StopAtDurationEnd>false</StopAtDurationEnd></Repetition><StartBoundary>2013-11-18T07:07:15</StartBoundary><Enabled>true</Enabled><ScheduleByDay><DaysInterval>1</DaysInterval></ScheduleByDay></CalendarTrigger>'
$EncryptSyncST.Task.Triggers.InnerXml = $UpdatedXML.InnerXML

Unregister-ScheduledTask "EncryptSyncTEST" -Confirm:$false
Register-ScheduledTask "EncryptSyncTEST" -Xml $EncryptSyncST.OuterXml -User $username -Password $password

Ответ 2

Хотя интерфейс PowerShell для запланированных триггеров заданий ограничен, оказывается, если вы установите для параметра RepetitionDuration значение [System.TimeSpan]::MaxValue, это приведет к длительности "неопределенно".

$trigger = New-ScheduledTaskTrigger '
    -Once '
    -At (Get-Date) '
    -RepetitionInterval (New-TimeSpan -Minutes 5) '
    -RepetitionDuration ([System.TimeSpan]::MaxValue)

Протестировано на Windows Server 2012 R2 (PowerShell 4.0)

Ответ 3

Вот способ создания запланированной задачи в Powershell (v5 на моей машине, YMMV), которая будет начинаться с 12 утра каждый день и повторяться ежечасно до конца дня. Поэтому он будет работать бесконечно. Я считаю, что это отличный подход и установка -RepetitionDuration в ([timespan]::MaxValue) как я уже отмечал ранее, поскольку триггер появится в Планировщике заданий как:

В 12:00 AM каждый день - после срабатывания повторяйте каждые 30 минут в течение 1 дня.

Вместо даты, когда была зарегистрирована задача, появляющейся в триггере, в качестве подходов, использующих -Once -At 12am результате -Once -At 12am создайте триггер как простой -Daily -At 12am, зарегистрируйте задачу, затем получите доступ к некоторым дополнительным свойствам на Задачи Запускает свойство;

$action = New-ScheduledTaskAction -Execute <YOUR ACTION HERE>
$trigger = New-ScheduledTaskTrigger -Daily -At 12am
$task = Register-ScheduledTask -TaskName "MyTask" -Trigger $trigger -Action $action
$task.Triggers.Repetition.Duration = "P1D" //Repeat for a duration of one day
$task.Triggers.Repetition.Interval = "PT30M" //Repeat every 30 minutes, use PT1H for every hour
$task | Set-ScheduledTask
//At this point the Task Scheduler will have the desirable description of the trigger.

Ответ 4

Самый простой метод, который я нашел для этого - использовать schtasks.exe. См. Полную документацию по адресу https://msdn.microsoft.com/en-us/library/windows/desktop/bb736357%28v=vs.85%29.aspx.

schtasks.exe /CREATE /SC DAILY /MO 1 /TN 'task name' /TR 'powershell.exe C:\test.ps1' /ST 07:00 /RI 30 /DU 24:00

Это создает задачу, которая выполняется ежедневно, повторяется каждые 30 минут в течение 1 дня.

Ответ 5

Другой способ сделать это - просто создать несколько триггеров:

$startTimes     = @("12:30am","6am","9am","12pm","3pm","6pm")
$triggers = @()
foreach ( $startTime in $startTimes )
{
    $trigger = New-ScheduledTaskTrigger -Daily -At $startTime -RandomDelay (New-TimeSpan -Minutes $jitter)
    $triggers += $trigger
}

Ответ 6

Создать базовый триггер:

$t1 = New-ScheduledTaskTrigger -Daily -At 01:00

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

$t2 = New-ScheduledTaskTrigger -Once -RepetitionInterval (New-TimeSpan -Minutes 15) -RepetitionDuration (New-TimeSpan -Hours 23 -Minutes 55)

Возьмите объект повторения из вторичного объекта и вставьте его в базовый триггер:

$t1.Repetition = $t2.Repetition

Боб твой дядя

New-ScheduledTask -Trigger $t1 -Action ...

Ответ 7

Если вы хотите, чтобы инфинитная продолжительность задачи в Windows 10 просто использовала это (не указывать -RepetitionDuration)

$action = New-ScheduledTaskAction -Execute (Resolve-Path '.\main.exe')
$trigger = New-ScheduledTaskTrigger -Once -At (Get-Date) -RepetitionInterval (New-TimeSpan -Hours 1)

Register-ScheduledTask -Action $action -Trigger $trigger -TaskName "GettingDataFromDB" -Description "Dump of new data every hour"

Ответ 8

fooobar.com/info/7636899/... Решение @SteinIP у меня с небольшой модификацией

В части 'create second trigger' добавлен параметр '-At' с тем же значением, что и в части 'create base trigger'.

Создать базовый триггер

$t1 = New-ScheduledTaskTrigger -Daily -At 01:00

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

$t2 = New-ScheduledTaskTrigger -Once -RepetitionInterval (New-TimeSpan -Minutes 15) -RepetitionDuration (New-TimeSpan -Hours 23 -Minutes 55) -At 01:00

Сделай магию:

$t1.Repetition = $t2.Repetition

New-ScheduledTask -Trigger $t1 -Action ...