web-dev-qa-db-fra.com

Tâche planifiée avec déclencheur quotidien et intervalle de répétition

Je n'arrive pas à comprendre comment créer une nouvelle tâche planifiée, déclenchée quotidiennement et répétée toutes les 30 minutes. Je suis allé en rond.

Tout ce qui précède ci-dessous fonctionne pour définir la tâche que je veux, mais ne doit être déclenché qu’une seule fois. 

#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

Si je change -Once en -Daily, je perds les drapeaux -RepetitionInterval. Et si je reviens pour mettre à jour la tâche quotidiennement après l'avoir enregistrée, le déclencheur qui se répète est effacé.

Ce n'est pas une méthode de planification inhabituelle et s'applique facilement via l'interface utilisateur du planificateur de tâches. J'ai l'impression que c'est probablement simple, mais il me manque. 

Toute aide est appréciée.

EDIT: Répondant à la question dupliquée. La question dans le post " Powershell v3 New-JobTrigger tous les jours avec répétition " demande la même chose. Mais comme je l'ai dit plus tôt, aucune des réponses ne résout le problème. La réponse marquée fait exactement ce que j'ai déjà ici, elle définit une tâche avec un déclencheur -Once, puis la met à jour toutes les 5 minutes pendant 1 jour. Après le premier jour, cette tâche ne sera plus jamais déclenchée. Il n'aborde pas le problème du déclenchement quotidien d'une tâche avec répétition et durée jusqu'au prochain déclencheur. 

Les trois autres réponses à ce message ne traitent pas non plus de la question. Je ne sais pas pourquoi il a été marqué une réponse, parce que ce n'est pas correct. J'ai exploré ces réponses avant de poster cette question. Avec cet article ayant vieilli et marqué comme ayant répondu, j'ai créé cette question.

Note: J'ai trouvé une solution de contournement, mais pas excellente. Actuellement, il semble que le moyen le plus simple de définir des déclencheurs personnalisés à l'aide de powershell est de manipuler le XML de tâche planifiée et de l'importer directement à l'aide de Register-ScheduledTask.

17
malexander

Je suis sûr qu'il doit y avoir un meilleur moyen, mais c'est ma solution actuelle.

J'ai créé une tâche avec les déclencheurs que je voulais, puis j'ai saisi le XML généré. 

Ci-dessous, je crée la tâche, puis extrait le XML pour cette nouvelle tâche, remplace mes déclencheurs, puis désenregistre la tâche et la réenregistre avec le XML mis à jour. 

À long terme, je vais probablement utiliser le fichier XML complet pour la tâche et remplacer les chaînes au besoin, mais cela fonctionne pour le moment.

#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
7
malexander

Bien que l'interface PowerShell pour les déclencheurs de tâches planifiées soit limitée, il s'avère que si vous définissez la variable RepetitionDuration sur [System.TimeSpan]::MaxValue, la durée "Indéfiniment".

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

Testé sur Windows Server 2012 R2 (PowerShell 4.0)

16
Shaddy Zeineddine

Voici un moyen de créer une tâche planifiée dans Powershell (v5 sur ma machine, YMMV) qui commencera à 12 heures tous les jours et à répéter toutes les heures pour le reste de la journée . Par conséquent, il fonctionnera indéfiniment. Je pense que c’est une approche supérieure par rapport à la définition de -RepetitionDuration à ([timespan]::MaxValue), comme je l’ai déjà dit, car le déclencheur apparaîtra dans le Planificateur de tâches comme suit:

À minuit tous les jours - Après le déclenchement, répétez toutes les 30 minutes pour une durée d'un jour.

Plutôt que la date d'enregistrement de la tâche figurant dans le déclencheur en tant qu'approches utilisant le code -Once -At 12am, créez le déclencheur comme un simple -Daily -At 12am, enregistrez la tâche, puis accédez à d'autres propriétés dans la propriété des déclencheurs de tâches;

$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.
12
James Webster

La méthode la plus simple que j'ai trouvée pour y parvenir consiste à utiliser schtasks.exe. Voir la documentation complète à 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

Cela crée une tâche qui s'exécute tous les jours et se répète toutes les 30 minutes pour une durée d'un jour. 

4
llamb

Une autre façon de le faire est simplement de créer plusieurs déclencheurs comme ceci:

$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
}
3
RacingStorm

Si vous voulez une tâche infinie sur Windows 10, utilisez simplement ceci (ne spécifiez pas -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"
1
Dawid K.

Créer un déclencheur de base:

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

Créer un déclencheur secondaire:

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

Prenez l'objet de répétition du secondaire et insérez-le dans le déclencheur de base:

$t1.Repetition = $t2.Repetition

Bob est ton oncle:

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