Planification de tâches sous Windows
Vue d'ensemble
Sous Windows, il existe deux systèmes principaux pour planifier des tâches :
- Planificateur de tâches (Task Scheduler) : Interface graphique et outil système
- PowerShell Jobs : Solution programmatique via PowerShell
Ces deux systèmes peuvent être utilisés via l'interface graphique (GUI) ou en ligne de commande.
Le Planificateur de tâches Windows
Qu'est-ce que c'est?
Le Planificateur de tâches est un composant système de Windows qui permet d'exécuter automatiquement des programmes, des scripts ou des actions à des moments spécifiques ou en réponse à des événements.
Composants d'une tâche planifiée
Une tâche complète comprend plusieurs éléments configurables, qui sont séparés en onglets dans l'interface du Planificateur de tâches.

1. Onglet Général
- Nom : Identifiant de la tâche
- Emplacement : Où est stockée la tâche dans la bibliothèque
- Auteur : Qui a créé la tâche
- Description : Documentation de l'objectif de la tâche
Options de sécurité et privilèges
Options d'utilisateur
Exécuter uniquement si l'utilisateur est connecté :
- Avantages :
- Accès aux lecteurs réseau mappés
- Interface graphique disponible
- Variables d'environnement utilisateur complètes
- Inconvénients :
- Ne fonctionne pas si l'utilisateur est déconnecté
- Limitée aux sessions actives
Exécuter même si l'utilisateur n'est pas connecté :
- Avantages :
- Fonctionne en arrière-plan
- Idéal pour les serveurs et maintenance
- Exécution garantie même sans connexion
- Inconvénients :
- Nécessite de stocker le mot de passe
- Pas d'interface graphique
- Environnement plus limité
Privilèges d'exécution
Exécuter avec les privilèges les plus élevés (Run with highest privileges) :
- Équivaut à "Exécuter en tant qu'administrateur"
- Nécessaire pour :
- Modifier des fichiers système
- Installer des logiciels
- Modifier le registre dans HKLM
- Accéder à des dossiers protégés
- ⚠️ Risque de sécurité : N'utilisez que si absolument nécessaire
2. Onglet Déclencheurs (Triggers)

Définissent quand la tâche s'exécute. Plusieurs types disponibles :
| Type | Description | Cas d'usage |
|---|---|---|
| Une fois | Exécution unique à une date/heure précise | Tests, tâches ponctuelles |
| Quotidien | Chaque jour à une heure donnée | Sauvegardes quotidiennes |
| Hebdomadaire | Jour(s) spécifique(s) de la semaine | Rapports hebdomadaires |
| Mensuel | Jour(s) spécifique(s) du mois | Facturations mensuelles |
| Au démarrage | Quand l'ordinateur démarre | Services, scripts d'initialisation |
| À l'ouverture de session | Quand un utilisateur se connecte | Configuration utilisateur |
| Lors de l'inactivité | Après X minutes d'inactivité | Tâches lourdes non prioritaires |
| Sur un événement | En réponse à un événement Windows | Alertes, réactions automatiques |
Notes importantes :
- Une tâche peut avoir plusieurs déclencheurs
- Les déclencheurs peuvent être activés/désactivés individuellement
- Certains types supportent la répétition (ex: toutes les 15 minutes)
3. Onglet Actions

Définissent ce que fait la tâche. Types d'actions :
| Type | Description | Exemple |
|---|---|---|
| Démarrer un programme | Exécute un .exe, .bat, .ps1, etc. | powershell.exe -File C:\script.ps1 |
| Envoyer un e-mail | Envoie un courriel (déprécié depuis Windows 8) | Notifications |
| Afficher un message | Popup à l'écran (déprécié depuis Windows 8) | Alertes utilisateur |
Recommandation : Utilisez principalement "Démarrer un programme". Pour les emails, utilisez un script PowerShell avec Send-MailMessage.
Il est important de remarquer qu'avec le planificateur de tâches Windows, vous pouvez exécuter n'importe quel type de programme ou script, pas seulement des scripts PowerShell, ce qui est une différence clé avec les PowerShell Jobs.
Il est également important de spécifier le chemin complet du programme/script à exécuter (et non un chemin relatif).
4. Onglet Conditions

Critères optionnels qui doivent être satisfaits pour que la tâche s'exécute :
Inactivité :
- Démarrer uniquement si l'ordinateur est inactif pendant X minutes
- Arrêter si l'ordinateur cesse d'être inactif
Alimentation :
- Exécuter seulement sur secteur (pas sur batterie)
- Arrêter si l'ordinateur passe sur batterie
Réseau :
- Exécuter seulement si une connexion réseau spécifique est disponible
Attention, une tâche peut ne pas s'exécuter si les conditions ne sont pas remplies, même si le déclencheur est activé.
5. Onglet Paramètres

Configuration du comportement de la tâche, entre autres :
- Autoriser l'exécution à la demande (manuellement)
- Arrêter la tâche si elle s'exécute plus de X temps
- Si la tâche échoue, la relancer après X temps
- Si la tâche est déjà en cours :
- Ne pas démarrer une nouvelle instance
- Démarrer une nouvelle instance en parallèle
- Mettre en file d'attente
- Arrêter l'instance existante
6. Onglet Historique

Journal des exécutions de la tâche :
Codes d'événements importants :
| ID | Signification | Description |
|---|---|---|
| 100 | Tâche démarrée | La tâche a commencé son exécution |
| 102 | Tâche terminée | La tâche s'est terminée (succès ou échec) |
| 103 | Échec au démarrage | La tâche n'a pas pu démarrer |
| 201 | Tâche terminée avec succès | Code de sortie 0 |
| 202 | Tâche terminée avec erreur | Code de sortie non-zéro |
Diagnostic et dépannage
Méthodologie de diagnostic
Étape 1 : Vérifier l'historique de la tâche
- Dans le Planificateur, onglet "Historique"
- Chercher les événements récents
- Identifier les codes d'erreur
Étape 2 : Consulter les journaux d'événements
Get-WinEvent -LogName "Microsoft-Windows-TaskScheduler/Operational" |
Where-Object {$_.Message -like "*NomTache*"} |
Select-Object TimeCreated, Id, Message
Étape 3 : Tester manuellement
- Clic droit sur la tâche > "Exécuter"
- Observer le comportement immédiat
- Vérifier les résultats attendus
PowerShell Jobs
La deuxième méthode de planification sous Windows est via les PowerShell Jobs. Windows PowerShell offre deux types de jobs complètement différents : Les Background Jobs et les Scheduled Jobs.
Les background jobs sont des tâches qui s'exécutent en arrière-plan dans la session PowerShell actuelle. Ils sont temporaires et disparaissent lorsque la session est fermée. Ils sont utiles pour exécuter des commandes longues sans bloquer la console. Par exemple, vous pouvez lancer un script de sauvegarde en arrière-plan tout en continuant à travailler dans la même session.
Les scheduled jobs, en revanche, sont des tâches planifiées qui s'exécutent de manière persistante, même après la fermeture de la session PowerShell. Ils sont gérés par le Planificateur de tâches Windows et permettent d'automatiser des scripts PowerShell à des intervalles réguliers ou à des moments spécifiques. Par exemple, vous pouvez créer un scheduled job pour exécuter un script de nettoyage de disque chaque semaine.
Comparaison des Background Jobs et Scheduled Jobs
| Aspect | Background Jobs | Scheduled Jobs |
|---|---|---|
| Durée de vie | Session PowerShell actuelle | Persistent (survit à la fermeture) |
| Planification | Non (exécution immédiate) | Oui (déclencheurs temporels) |
| Stockage | Mémoire de la session | Disque + Task Scheduler |
| Persistance | Perdus à la fermeture de PowerShell | Conservés après redémarrage |
| Cas d'usage | Parallélisation de tâches longues | Automatisation récurrente |
Background Jobs
Concept
Les Background Jobs permettent d'exécuter des commandes PowerShell en arrière-plan sans bloquer la console.
Analogie : C'est comme ouvrir un nouvel onglet dans votre navigateur pour charger une page lourde pendant que vous continuez à utiliser l'onglet actuel.
Cycle de vie d'un Background Job
Puisque les background jobs s'éxécutent en arrière-plan, ils passent par plusieurs états, représentés dans ce cycle de vie:
Création → Running → Completed/Failed → Récupération résultats → Suppression
↓ ↓ ↓ ↓ ↓
Start-Job Get-Job Wait-Job Receive-Job Remove-Job
À chaque étape, il y a une cmdlet associée pour interagir avec le job.
États possibles
| État | Signification |
|---|---|
Running |
Le job s'exécute actuellement |
Completed |
Le job s'est terminé avec succès |
Failed |
Le job a échoué |
Stopped |
Le job a été arrêté manuellement |
Blocked |
Le job attend une entrée utilisateur |
Receive-Job : Comportement important
La cmdlet Receive-Job est utilisée pour récupérer les résultats d'un background job. Cependant, elle a un comportement particulier à comprendre : Par défaut, Receive-Job supprime les résultats après les avoir récupérés.
# Première fois : affiche les résultats
Receive-Job -Name "MonJob"
# Deuxième fois : ne retourne rien (résultats déjà consommés)
Receive-Job -Name "MonJob"
Solution : Utilisez -Keep pour conserver les résultats :
Receive-Job -Name "MonJob" -Keep
Bonnes pratiques
Vérifier l'état avant de récupérer :
if ($job.State -eq "Completed") { ... }Utiliser Wait-Job avec timeout :
Wait-Job -Name "MonJob" -Timeout 300 # 5 minutes maxNettoyer les jobs terminés :
Get-Job | Where-Object {$_.State -eq "Completed"} | Remove-Job
Scheduled Jobs (Jobs planifiés)
Concept
Les Scheduled Jobs sont une couche PowerShell au-dessus du Planificateur de tâches Windows. Comme le planificateur, ils permettent d'exécuter des tâches à des moments spécifiques ou selon des déclencheurs. Cependant, ils sont conçus spécifiquement pour exécuter des scripts PowerShell (il n'est pas possible de planifier des programmes non-PowerShell avec cette méthode).
Les jobs créés avec Register-ScheduledJob apparaissent dans le Planificateur de tâches sous :
\Microsoft\Windows\PowerShell\ScheduledJobs\
Création d'un Scheduled Job : Les trois composantes
Pour créer un Scheduled Job, vous avez besoin de trois éléments :
- Le code à exécuter : Un ScriptBlock ou un fichier script
- Un ou plusieurs déclencheurs : Quand le job s'exécute
- Des options (facultatif) : Comment le job s'exécute
Exemple de création complète :
# 1. Définir le déclencheur
$trigger = New-JobTrigger -Daily -At "02:00"
# 2. Définir les options (facultatif)
$options = New-ScheduledJobOption -RunElevated -WakeToRun
# 3. Créer le job avec tout ça
Register-ScheduledJob -Name "MonJob" `
-ScriptBlock { Get-Process | Export-Csv "C:\Rapports\processes.csv" } `
-Trigger $trigger `
-ScheduledJobOption $options
Déclencheurs (Triggers) : Quand le job s'exécute
Les déclencheurs sont créés avec New-JobTrigger et définissent le moment d'exécution.
Types de déclencheurs de base :
| Type | Syntaxe | Utilisation |
|---|---|---|
| Daily | -Daily -At "HH:MM" |
Tous les jours à une heure fixe |
| Weekly | -Weekly -DaysOfWeek <Jour> -At "HH:MM" |
Jours spécifiques de la semaine |
| Once | -Once -At <DateTime> |
Une seule fois à une date précise |
| AtStartup | -AtStartup |
Au démarrage de l'ordinateur |
| AtLogon | -AtLogOn |
À la connexion de l'utilisateur |
Exemples concrets :
# Tous les jours à 2h du matin
$trigger1 = New-JobTrigger -Daily -At "02:00"
# Chaque lundi à 10h
$trigger2 = New-JobTrigger -Weekly -DaysOfWeek Monday -At "10:00"
# Une seule fois le 31 décembre à 23h59
$trigger3 = New-JobTrigger -Once -At "2025-12-31 23:59"
# Au démarrage de l'ordinateur
$trigger4 = New-JobTrigger -AtStartup
Déclencheurs avec répétition :
Pour des exécutions répétitives (ex: toutes les 15 minutes), utilisez -RepetitionInterval :
# Toutes les 15 minutes, indéfiniment
$trigger = New-JobTrigger -Once -At (Get-Date) `
-RepetitionInterval (New-TimeSpan -Minutes 15) `
-RepetitionDuration ([TimeSpan]::MaxValue)
Multiples déclencheurs : Un job peut avoir plusieurs déclencheurs. Il s'exécutera quand n'importe lequel se déclenche.
# Créer le job avec un premier déclencheur
Register-ScheduledJob -Name "MonJob" -ScriptBlock {...} -Trigger $trigger1
# Ajouter d'autres déclencheurs après coup
Add-JobTrigger -Name "MonJob" -Trigger $trigger2
Add-JobTrigger -Name "MonJob" -Trigger $trigger3
# Voir tous les déclencheurs
Get-JobTrigger -Name "MonJob"
Options : Comment le job s'exécute
Les options sont créées avec New-ScheduledJobOption et contrôlent le comportement du job.
Options principales :
| Option | Description | Défaut | Cas d'usage |
|---|---|---|---|
RunElevated |
Exécuter avec privilèges élevés | $false |
Accès fichiers système, registre |
WakeToRun |
Réveiller l'ordinateur pour exécuter | $false |
Sauvegardes nocturnes |
StartIfOnBattery |
Démarrer même sur batterie | $true |
Portables |
ContinueIfGoingOnBattery |
Continuer si passage sur batterie | $true |
Portables |
RequireNetwork |
Nécessite une connexion réseau | $false |
Synchronisation en ligne |
HideInTaskScheduler |
Masquer dans le GUI | $false |
Jobs système cachés |
MultipleInstancePolicy |
Gestion des instances multiples (IgnoreNew, Queue, Parallel, StopExisting) |
IgnoreNew |
Contrôle le comportement si plusieurs instances sont lancées |
Exemple d'utilisation :
# Job qui doit tourner avec des privilèges élevés
# et peut réveiller l'ordinateur si nécessaire
$options = New-ScheduledJobOption -RunElevated -WakeToRun
# Appliquer les options lors de la création
Register-ScheduledJob -Name "MonJob" `
-ScriptBlock {...} `
-Trigger $trigger `
-ScheduledJobOption $options
Deux types de commandes : Définitions vs Instances
Il est important de faire la différence entre les définitions de jobs et les instances de jobs. Une définition est la configuration du job (quand, quoi, comment), tandis qu'une instance est une exécution particulière de ce job.
C'est un peu comme la différence entre une classe (définition) et un objet (instance) en programmation orientée objet. Une analogie souvent utilisée dans ce contexte serait que la définition est comme une recette de cuisine, et les instances sont les plats que vous cuisinez à partir de cette recette.
Les deux commandes principales :
| Commande | Ce qu'elle retourne | Combien d'objets | Persiste après |
|---|---|---|---|
Get-ScheduledJob |
Les définitions (modèles) | 1 par job créé | Redémarrage |
Get-Job |
Les instances (exécutions) | 1 par exécution | Session PowerShell |
Exemple concret :
# Créer un job qui s'exécute toutes les heures
$trigger = New-JobTrigger -Once -At (Get-Date) `
-RepetitionInterval (New-TimeSpan -Hours 1) `
-RepetitionDuration ([TimeSpan]::MaxValue)
Register-ScheduledJob -Name "MonJob" -ScriptBlock { Get-Date } -Trigger $trigger
# Attendre quelques heures...
# Voir la DÉFINITION (le modèle)
Get-ScheduledJob -Name "MonJob"
# Retourne : 1 objet (la définition)
# Voir les INSTANCES (les exécutions)
Get-Job -Name "MonJob"
# Retourne : 5 objets (si le job s'est exécuté 5 fois)
Pourquoi cette distinction est importante :
Get-ScheduledJob: Pour gérer la configuration (changer déclencheurs, supprimer le job)Get-Job: Pour voir les résultats d'exécution (succès, échec, récupérer les sorties)
Stockage automatique des résultats
Contrairement aux Background Jobs (qui disparaissent à la fermeture de PowerShell), les Scheduled Jobs sauvegardent automatiquement leurs résultats sur le disque.
Emplacement : $HOME\AppData\Local\Microsoft\Windows\PowerShell\ScheduledJobs\
Structure des dossiers :
ScheduledJobs\
└── MonJob\ # Un dossier par job
├── Output\ # Résultats des exécutions
│ ├── 20250101_020000\ # Une exécution spécifique
│ ├── 20250102_020000\
│ └── ...
├── Status.xml # État du job
└── ScheduledJobDefinition.xml # Configuration
Limite de conservation : Par défaut, seules les 32 dernières exécutions sont conservées. Les plus anciennes sont automatiquement supprimées.
Récupérer les résultats :
# Récupérer les résultats d'une instance spécifique
$job = Get-Job -Name "MonJob" -Newest 1
Receive-Job -Job $job -Keep
Intégration avec le Planificateur de tâches
Comment ça fonctionne
Quand vous créez un Scheduled Job avec Register-ScheduledJob, PowerShell crée automatiquement une tâche dans le Planificateur de tâches Windows. C'est cette tâche qui se charge de l'exécution selon l'horaire défini.
Emplacement dans le Planificateur :
Bibliothèque du Planificateur de tâches\Microsoft\Windows\PowerShell\ScheduledJobs\
Cependant, l'inverse n'est pas vrai : Si vous créez une tâche directement dans le Planificateur de tâches, elle n'apparaîtra pas dans PowerShell comme un Scheduled Job.