Planification de tâches sous Windows

Vue d'ensemble

Sous Windows, il existe deux systèmes principaux pour planifier des tâches :

  1. Planificateur de tâches (Task Scheduler) : Interface graphique et outil système
  2. 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.

Illustration de la planification sous Windows

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)

Illustration des déclencheurs

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

Illustration des 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

Illustration des 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

Illustration des 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

Illustration des 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

  1. Vérifier l'état avant de récupérer :

    if ($job.State -eq "Completed") { ... }
    
  2. Utiliser Wait-Job avec timeout :

    Wait-Job -Name "MonJob" -Timeout 300  # 5 minutes max
    
  3. Nettoyer 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 :

  1. Le code à exécuter : Un ScriptBlock ou un fichier script
  2. Un ou plusieurs déclencheurs : Quand le job s'exécute
  3. 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.