U6-SP2-M4Scripts d'exploitation
0 / 0
Scénario 2 · TechnoVert

Scripts d'exploitation

Tout ce dont vous avez besoin pour ce module, dans un seul document. Cochez au fur et à mesure.

U6-SP2-M4module
Élèvedocument
TechnoVertscénario 2
B · 3 hformat et durée

Comment utiliser ce document

  • À gauche, une partie à la fois. Cliquez pour changer de partie.
  • Les boutons bleus A1 ouvrent une annexe dans le panneau de droite.
  • Vos réponses et vos cases cochées sont gardées dans ce navigateur.
Rappels

Ce qu'il faut savoir avant de commencer

Ce qu'il faut savoir avant de commencer. Lisez-le si vous avez un doute. Environ 10 minutes.

Comment lancer un script Python dans PowerShell ?

Un fichier Python se lance avec la commande python, suivie du nom du fichier.

python bonjour.py

PowerShell cherche le fichier dans le dossier courant. C'est le dossier où vous vous trouvez, écrit avant le > de l'invite.

La commande ls liste son contenu. La commande cd change de dossier.

Un chemin qui ne commence pas par une lettre de disque, comme rapports\liste.csv, part du dossier courant. On l'appelle un chemin relatif.

Comment rattraper une erreur avec try et except ?

Quand une instruction échoue, Python s'arrête et affiche une trace. Avec try et except, on prévoit ce qu'il faut faire à la place.

try:
    age = int("douze")
except ValueError:
    print("Ce n'est pas un nombre.")

Ici, int("douze") échoue. Python ne plante pas : il affiche le message.

C'est quoi une base SQLite ?

Une base SQLite tient dans un seul fichier, par exemple club.db. Elle contient des tables. Chaque table a des colonnes et des lignes.

En Python, le module sqlite3 ouvre la base et envoie des requêtes SQL.

import sqlite3
con = sqlite3.connect("club.db")
nombre = con.execute("SELECT COUNT(*) FROM membre").fetchone()[0]
con.close()

SELECT COUNT(*) compte les lignes de la table membre.

Comment écrire un fichier CSV en Python ?

Un fichier CSV est un tableau écrit en texte : une ligne par ligne du tableau, les colonnes séparées par un point-virgule.

import csv
with open("liste.csv", "w", newline="", encoding="utf-8") as f:
    ecrivain = csv.writer(f, delimiter=";")
    ecrivain.writerow(["nom", "age"])
    ecrivain.writerow(["Durand", 16])

Le fichier obtenu contient deux lignes : nom;age, puis Durand;16.

Vérifiez-vous

Voir les réponses
  1. Dans C:\Users\lea\Documents\club, le dossier courant.
  2. La division par zéro échoue. Python ne plante pas : x prend la valeur 0.
  3. SELECT COUNT(*) FROM jeu;
Cours

Écrire un script exploitable

COURS-U6-S1-07

Marc Oliveira est le trésorier de MaisonDesJeux, une association de jeux de société. Il tient le fichier des adhérents depuis six ans. Ce fichier a déjà été perdu deux fois.

Aujourd'hui, le fichier est une base de données sur le poste du bureau. Pour la protéger, Marc la copie sur une clé USB, quand il y pense.

Sa dernière copie date de quatre mois. Il ne l'a jamais ouverte.

Bruno, un bénévole, propose d'écrire « un petit programme qui fait ça tout seul ». Marc hésite : « Et s'il plante la nuit, qui me le dira ? »

À la fin de la séance, vous saurez écrire un script qui tourne seul et qui dit s'il a réussi. Et vous saurez prouver qu'une sauvegarde marche.

Le plan de la séance

  1. Un script qu'on règle sans toucher au code.
  2. Dire si ça a marché : code de retour et journal.
  3. Lancer le script à heure fixe.
  4. Sauvegarder, et prouver qu'on sait restaurer.

La question de départ

Un programme tourne seul à 6 h du matin. Personne n'est devant l'écran. Il échoue. Comment le savoir le lendemain ?

Capsule 1 sur 4Un script qu'on règle sans toucher au code

Bruno veut un programme qui fait une tâche à la place de Marc. Première question : en quoi est-ce différent des programmes que vous avez déjà écrits ?

On l'appelle un SCRIPT. C'est un petit programme qui fait une tâche d'exploitation à la place d'un humain : copier, compter, vérifier, exporter.

Il n'a pas de fenêtre. Il est souvent lancé par une machine, pas par une personne.

Personne n'est donc là pour répondre à un input(). Le script reçoit ses réglages au moment où on le lance. Ces réglages s'appellent des ARGUMENTS : des valeurs écrites sur la ligne de commande, après le nom du script.

Pensez à une machine à laver. Vous choisissez 30 ou 60 degrés à chaque lavage. Vous ne démontez pas la machine pour changer la température.

  1. On écrit le nom de l'argument avec deux tirets : --dossier.
  2. On écrit sa valeur juste après, séparée par une espace : partage.
  3. Dans le script, le module argparse lit la ligne. Il range chaque valeur sous son nom : args.dossier.
  4. Si un argument obligatoire manque, argparse affiche le mode d'emploi et arrête le script.
parser = argparse.ArgumentParser(description="Inventaire d'un dossier.")
parser.add_argument("--dossier", required=True, help="le dossier à inventorier")
parser.add_argument("--sortie", default="rapports", help="le dossier des rapports")
args = parser.parse_args()

required=True rend l'argument obligatoire. default donne la valeur utilisée quand l'argument est absent.

Une ligne de commande, découpée en morceaux PS> python inventaire.py --dossier partage --sortie rapports le programme qui lit le script le script à exécuter argument 1 nom : dossier valeur : partage argument 2 nom : sortie valeur : rapports Même script, autre dossier : on change la valeur, jamais le code.
Une ligne de commande découpée : le programme, le script, puis chaque argument avec son nom et sa valeur

On le fait ensemble — la sauvegarde de Marc

1. Marc tape python sauvegarde.py --base adherents.db --dest E:\copies. Quel est le script ?

2. Combien d'arguments ?

3. Quelle est la valeur de --dest ?

4. Marc change de clé. Elle apparaît en F:. Que modifie-t-il ?

Exemple Pourquoi
✔ python inventaire.py --dossier partage\public Même script, autre dossier : seule la valeur change.
✘ Modifier dossier = "partage" dans le code avant chaque lancement On risque de casser le script. Et une machine ne peut pas modifier le code à votre place.
✘ Demander le dossier avec input() Le script qui tourne seul attend une réponse que personne ne tapera. Il reste bloqué.

Checkpoint

À l'oral, 3 minutes. Chacun note sa réponse sur sa feuille, puis on corrige.

1. On lance python inventaire.py --dossier public --sortie bilan. Quelle est la valeur de args.sortie ?

2. On lance python inventaire.py --sortie bilan. Que se passe-t-il, avec le code ci-dessus ?

Capsule 2 sur 4Dire si ça a marché : code de retour et journal

Le script se règle sans toucher au code. Reste la question de Marc : s'il échoue la nuit, comment le savoir ?

Le script le dit de deux façons.

D'abord, par son CODE DE RETOUR. C'est un nombre que le script rend au système quand il s'arrête : 0 si tout va bien, un autre nombre sinon. Le nombre dit quelle erreur a eu lieu.

Ensuite, par son JOURNAL. C'est un fichier texte où le script écrit ce qu'il fait, une ligne par événement, avec la date et l'heure.

Pensez au suivi d'un colis. L'appli affiche « Livré » ou « Échec de livraison » : c'est le code. Le détail dit « Absent, avis déposé à 14 h 32 » : c'est le journal.

  1. Le script se termine par sys.exit(0) quand tout est fait.
  2. Pour chaque échec prévu, il rend un code choisi par l'équipe : 3 pour « dossier introuvable », par exemple. Les codes sont écrits dans les règles de l'équipe.
  3. Python rend 1 tout seul quand le script plante. argparse rend 2 quand les arguments sont faux.
  4. Le code est lu par une machine : PowerShell le range dans $LASTEXITCODE, l'ordonnanceur le garde aussi.
  5. Le journal est lu par un humain. Le module logging écrit chaque ligne avec son heure et son niveau : INFO pour une étape normale, ERROR pour un échec.
logging.info("Début de l'inventaire de %s", args.dossier)
if not dossier.is_dir():
    logging.error("Dossier introuvable : %s", dossier)
    sys.exit(3)
Le script sys.exit(3) code de retour : 3 Pour la machine PowerShell : $LASTEXITCODE Planificateur de tâches : « résultat de la dernière exécution » une ligne écrite Pour l'humain : le journal inventaire.log 2026-10-07 06:00:01 INFO Début de l'inventaire de partage 2026-10-07 06:00:01 ERROR Dossier introuvable : partage Le code dit « ça a raté ». Le journal dit quand, et pourquoi.
Le code de retour part vers la machine, le journal garde la trace pour l'humain

On le fait ensemble — la clé USB oubliée

1. Marc lance la sauvegarde, mais la clé n'est pas branchée. Le script peut-il rendre 0 ?

2. Les règles de l'équipe disent 3 pour « dossier introuvable ». Quelle ligne termine le script ?

3. Que doit contenir le journal ?

4. Le script plante sur une erreur que personne n'a prévue. Quel code rend-il ?

Exemple Pourquoi
✔ sys.exit(0) à la dernière ligne, quand tout est fait Le code dit clairement : réussi.
✘ print("Erreur !"), puis le script se termine normalement Le code vaut 0. La machine croit que tout va bien. Personne n'est prévenu.
✘ Une ligne de journal Erreur sans date ni cause On ne sait ni quand ni pourquoi. Le journal ne sert à rien.

Checkpoint

À l'oral, 3 minutes. Chacun note sa réponse sur sa feuille, puis on corrige.

1. Après un lancement, $LASTEXITCODE vaut 2. Quelle est la cause la plus probable ?

2. Pourquoi écrire dans un fichier journal plutôt qu'à l'écran avec print ?

Capsule 3 sur 4Lancer le script à heure fixe

Le script dit maintenant s'il a réussi. Mais Marc doit encore penser à le lancer. Comment le faire partir tout seul ?

On confie ce travail à un ORDONNANCEUR. C'est un programme du système qui lance des tâches à l'heure prévue.

Sur Windows, c'est le Planificateur de tâches. Sur Linux, c'est cron.

C'est comme programmer le réveil de votre téléphone. Vous le réglez une fois. Il sonne chaque matin, même si vous dormez.

Une tâche planifiée a deux parties : le déclencheur, qui dit quand, et l'action, qui dit quoi lancer.

  1. Testez le script à la main d'abord. Il doit marcher et rendre 0.
  2. Réglez le déclencheur : une fois, chaque jour, chaque lundi, le 1er du mois.
  3. Réglez l'action : le programme python.exe, les arguments, et le dossier de départ. Les chemins relatifs du script partent de ce dossier.
  4. Vérifiez une vraie exécution : l'heure de la dernière exécution, son code de retour, et la ligne du journal à cette heure.
Une tâche planifiée : « Export-adherents » Le déclencheur QUAND ? le 1er du mois, à 6 h L'action : QUOI ? le programme : python.exe les arguments : export.py --base adherents.db le dossier de départ : Documents\export le temps passe, personne n'est devant l'écran 1er septembre 1er octobre 1er novembre code 0 code 0 code 3 : à regarder L'ordonnanceur lance le script et garde son dernier code de retour.
Une tâche planifiée : un déclencheur, une action, et le dernier code de retour gardé à chaque exécution

On le fait ensemble — l'inventaire du lundi

1. Marc veut l'inventaire du partage chaque lundi à 8 h. Quel est le déclencheur ?

2. Quel programme l'action lance-t-elle ?

3. Quel dossier de départ ?

4. Mardi, le Planificateur affiche 3 comme dernier résultat. Que faites-vous ?

Exemple Pourquoi
✔ Lancer la tâche une fois à la main, puis lire son résultat et le journal On voit une vraie exécution avant de partir.
✘ « La tâche est créée, donc ça marche. » Créer n'est pas exécuter. Seule une exécution réelle, avec le code 0, le prouve.
✘ Planifier la tâche à 3 h sur un poste éteint la nuit Un ordinateur éteint ne lance rien. Choisissez une heure où le poste est allumé.

Checkpoint

À l'oral, 3 minutes. Chacun note sa réponse sur sa feuille, puis on corrige.

1. Le Planificateur affiche 0 comme dernier résultat, à 6 h 00 ce matin. Qu'est-ce que ça prouve ?

2. Quelle erreur fait écrire le journal dans un autre dossier que prévu ?

Capsule 4 sur 4Sauvegarder, et prouver qu'on sait restaurer

On sait lancer un script seul, et savoir s'il a réussi. Revenons à la clé USB de Marc. Ses copies sont-elles vraiment utiles ?

Une SAUVEGARDE est une copie datée des données, rangée ailleurs, pour les retrouver après une perte. La RESTAURATION, c'est reconstruire les données à partir de cette copie.

Pour comparer deux bases, on calcule leur EMPREINTE. C'est un code court calculé à partir de tout le contenu. Si une seule lettre change, l'empreinte change.

Vos photos sont sauvegardées sur un cloud. Le jour où le téléphone tombe dans l'eau, vous les récupérez sur un nouveau téléphone. Mais vous ne savez si ça marche qu'en essayant.

Instant histoire — 1998 : Toy Story 2 presque effacé

En 1998, chez Pixar, une commande d'effacement est lancée par erreur. Elle supprime la plupart des fichiers du film Toy Story 2.

Les sauvegardes ne marchaient plus depuis des semaines. Personne ne l'avait vu.

Le film est sauvé par une copie qu'une responsable gardait chez elle, sur son ordinateur.

Pixar avait des sauvegardes. Qu'est-ce qui a manqué ?

  1. Exportez la base dans un fichier daté : sauvegarde_2026-10-01.sql, par exemple.
  2. Rangez la copie ailleurs : un autre disque, un autre lieu. Jamais seulement à côté de la base.
  3. Restaurez dans une base neuve, jamais sur la base en service.
  4. Comparez avant et après : le nombre de lignes de chaque table, et l'empreinte. Tout doit être identique.
1. La base compter les lignes empreinte : 5c1e… 2. Sauvegarder une copie datée, rangée ailleurs 3. La perte base effacée ou abîmée 4. Restaurer une base neuve depuis la copie 5. Comparer avant et après OK mêmes lignes, même empreinte 5c1e… : la restauration est prouvée X « le fichier existe » : ça ne prouve rien, il peut être vide Une sauvegarde qu'on n'a jamais restaurée n'est pas une preuve.
Sauvegarder, perdre, restaurer, puis comparer : seule la comparaison prouve la restauration

On le fait ensemble — la clé USB de Marc

1. La copie de Marc a quatre mois. Est-ce une sauvegarde ?

2. Où la restaurer pour la tester ?

3. Comment savoir si elle est complète ?

4. La copie a moins de lignes que la base actuelle. Pourquoi ?

Exemple Pourquoi
✔ Chaque mois, restaurer la dernière copie dans un dossier de test et comparer La sauvegarde est prouvée à chaque fois.
✘ Ranger la sauvegarde sur le même disque que la base Si le disque lâche, la base et sa copie disparaissent ensemble.
✘ « Le fichier de sauvegarde pèse 180 Ko, donc il est bon. » La taille ne dit rien du contenu. Seules la restauration et la comparaison le prouvent.

Checkpoint

À l'oral, 3 minutes. Chacun note sa réponse sur sa feuille, puis on corrige.

1. Pourquoi restaurer dans une base neuve, et pas sur la base en service ?

2. Avant et après la restauration, les tables ont le même nombre de lignes, mais l'empreinte d'une table est différente. La restauration est-elle prouvée ?

Ce qu'on retient

Si vous ne devez retenir que trois choses

1. Un script se règle par ses arguments et rend un code de retour : 0 si tout va bien, un autre nombre sinon.

2. Un script qui tourne seul écrit un journal daté. On vérifie toujours une vraie exécution : son heure, son code, sa ligne de journal.

3. Une sauvegarde n'est prouvée que restaurée dans une base neuve, puis comparée à l'original.

Revenons à Marc. Un script exporte maintenant la base le 1er de chaque mois, à 6 h, lancé par le Planificateur. S'il échoue, il rend un code d'erreur et l'écrit dans son journal.

Et chaque mois, quelqu'un restaure la dernière copie dans un dossier de test. Marc ne se demande plus si ses copies marchent : il le voit.

Fiche

Écrire un script exploitable

COURS-U6-S1-07

L'essentiel

Les mots à connaître

Mot En clair
Argument Une valeur donnée au script sur la ligne de commande : --dossier partage.
argparse Le module Python qui lit les arguments et affiche le mode d'emploi.
Code de retour Le nombre rendu par le script quand il s'arrête. $LASTEXITCODE dans PowerShell.
logging Le module Python qui écrit le journal, avec l'heure et le niveau.
Ordonnanceur Le programme qui lance les tâches à l'heure prévue : Planificateur de tâches, cron.
Dossier de départ Le dossier d'où partent les chemins relatifs quand la tâche se lance.
Empreinte Un code court calculé sur tout le contenu. Un seul changement, et elle change.

Les codes à connaître

Code Qui le rend Sens
0 le script, avec sys.exit(0) tout va bien
1 Python, tout seul le script a planté
2 argparse, tout seul arguments faux ou manquants
3 et plus le script, avec sys.exit(…) un échec prévu, selon les règles de l'équipe

La méthode : rendre un script prêt à tourner seul

  1. Remplacez les valeurs écrites dans le code par des arguments.
  2. Prévoyez chaque échec : une ligne ERROR dans le journal, puis sys.exit avec le bon code.
  3. Terminez par sys.exit(0).
  4. Testez à la main, puis planifiez, avec le dossier de départ.
  5. Vérifiez une vraie exécution : heure, code, journal.

Un exemple concret

Le Planificateur affiche 3 comme dernier résultat de l'inventaire du lundi.

Étape Ce qu'on fait Résultat
1 Lire l'heure de la dernière exécution Lundi, 8 h 00 : la tâche a bien tourné.
2 Lire le code : 3 Un échec prévu, pas un plantage.
3 Lire le journal à 8 h 00 ERROR Dossier introuvable : partage
4 Chercher la cause Le dossier de départ manque dans l'action.

Conclusion : on corrige l'action de la tâche, on la relance à la main, et on vérifie que le code revient à 0.

Les pièges

Labo

Script d'inventaire, journal et restauration

LABO-U6-S1-07

Contexte — Marc Oliveira, le trésorier de MaisonDesJeux, veut deux choses. Savoir chaque semaine ce que contient le dossier partagé de l'association. Et ne plus jamais perdre le fichier des adhérents.

Bruno Sanchez, bénévole, a écrit un début de script d'inventaire. Il marche, mais seulement sur un dossier écrit dans le code, et il ne dit jamais s'il a échoué. Vous le rendez prêt à tourner seul, vous le planifiez, puis vous prouvez qu'on sait restaurer la base.

Règle IA de la séance

Scénario 1 : pas d'IA pendant ce labo. Vous avez les annexes, l'aide --help et la recherche web classique.

Bloqué ? Relisez l'annexe citée dans l'étape, puis demandez au formateur.

À la fin de ce labo, vous saurez régler un script par ses arguments. Il écrira un journal et rendra un code de retour. Vous saurez aussi le planifier et prouver une restauration.

Comment ça se valide — à chaque point de contrôle, vous montrez votre résultat au formateur. Il valide, puis vous passez à la suite.

Les mots de la séance

Mot Ce que ça veut dire
Script Un petit programme sans fenêtre, qui fait une tâche à la place d'un humain.
Argument Une valeur donnée au script sur la ligne de commande : --dossier partage.
Code de retour Le nombre rendu par le script quand il s'arrête. 0 veut dire « réussi ».
Journal Le fichier texte où le script note ce qu'il fait, avec la date et l'heure.
Planificateur de tâches Le programme de Windows qui lance une tâche à l'heure prévue.
Inventaire La liste de tous les fichiers d'un dossier, avec leur taille.
Empreinte Un code court calculé sur tout le contenu d'une table. Un seul changement, et elle change.

Ce dont vous avez besoin

En binôme — le pilote tape, le lecteur lit les consignes et les annexes à voix haute, et vérifie chaque résultat. On inverse à la partie C.

Le plan du labo

Partie Étapes Ce que vous obtenez Temps
A — Un script réglé par ses arguments 1 à 6 l'inventaire de n'importe quel dossier, sans toucher au code 30 min
B — Un journal et des codes de retour 7 à 12 un script qui dit s'il a réussi, et pourquoi il a échoué 30 min
C — Planifier le script 13 à 18 un inventaire lancé par Windows, et son résultat lu 30 min
D — Sauvegarder et restaurer la base 19 à 24 une restauration prouvée par la comparaison 30 min

PARTIE A — Un script réglé par ses arguments

Étapes 1 à 6, environ 30 min. À la fin, le script fait l'inventaire du dossier que vous lui donnez sur la ligne de commande.

Besoin d'un rappel ? Revoir le cours : « Un script qu'on règle sans toucher au code ».

01

Installer le dossier de travail

Vous devez voir : un dossier mdj-scripts dans « Documents ». Il contient adherents.db, inventaire.py, restaurer.py, verifier_base.py et le dossier partage.

Si vous voyez un dossier mdj-scripts dans un autre dossier mdj-scripts : utilisez celui qui contient directement inventaire.py.

02

Ouvrir le dossier dans VS Code

ls

Vous devez voir : cinq éléments, dont inventaire.py et partage. Le terminal est déjà dans le dossier mdj-scripts : c'est votre dossier courant.

03

Lancer la version de départ

python inventaire.py

Vous devez voir : deux lignes. L'heure dans le nom du rapport sera la vôtre.

20 fichiers, 51600 octets
Rapport : rapports\inventaire_2026-10-07_140512.csv

Si vous voyez « python n'est pas reconnu » : tapez py à la place de python, ici et dans toute la suite.

Pourquoi ? Marc veut aussi l'inventaire du seul dossier partage\public. Avec cette version, que faut-il faire à chaque fois ?

Votre réponse :

04

Trouver dans la doc

Vous allez remplacer le dossier écrit dans le code par un argument. Le module qui lit les arguments s'appelle argparse.

Vous devez avoir : deux mots écrits entre les parenthèses de add_argument. Vous les utilisez à l'étape suivante.

05

Ajouter les arguments

parser = argparse.ArgumentParser(description="Inventaire d'un dossier.")
parser.add_argument("--dossier", required=True, help="le dossier à inventorier")
parser.add_argument("--sortie", default="rapports", help="le dossier des rapports")
args = parser.parse_args()

dossier = Path(args.dossier)
sortie = Path(args.sortie)

Vous devez voir : aucun point rouge sur l'onglet de inventaire.py dans VS Code. Le fichier est enregistré.

06

Tester les arguments

python inventaire.py --dossier partage
python inventaire.py --dossier partage\animations
python inventaire.py --help

Vous devez voir : 20 fichiers et 51600 octets pour la première commande. 9 fichiers et 24300 octets pour la deuxième. Pour la troisième, le mode d'emploi :

usage: inventaire.py [-h] --dossier DOSSIER [--sortie SORTIE]

Inventaire d'un dossier.

options:
  -h, --help         show this help message and exit
  --dossier DOSSIER  le dossier à inventorier
  --sortie SORTIE    le dossier des rapports

Pourquoi ? Dans le mode d'emploi, --sortie SORTIE est entre crochets, mais pas --dossier DOSSIER. Que veulent dire ces crochets ?

Votre réponse :

POINT DE CONTRÔLE A

  • Montrez au formateur l'inventaire de partage\animations, lancé avec l'argument --dossier.
  • Le formateur a validé. Passez à la partie B.

PARTIE B — Un journal et des codes de retour

Étapes 7 à 12, environ 30 min. À la fin, le script rend un code qui dit s'il a réussi, et il note chaque lancement dans son journal.

Besoin d'un rappel ? Revoir le cours : « Dire si ça a marché : code de retour et journal ».

07

Lire le code de retour

Après chaque commande, PowerShell range le code de retour dans la variable $LASTEXITCODE.

python inventaire.py --dossier partage
$LASTEXITCODE

Vous devez voir : l'inventaire, puis 0.

python inventaire.py
$LASTEXITCODE

Vous devez voir :

usage: inventaire.py [-h] --dossier DOSSIER [--sortie SORTIE]
inventaire.py: error: the following arguments are required: --dossier
2
08

Découvrir un échec silencieux

python inventaire.py --dossier partages
$LASTEXITCODE

Vous devez voir : 0 fichiers, 0 octets, un rapport vide, puis 0.

Le dossier n'existe pas, et pourtant le script dit « réussi ». Un Planificateur ne verrait aucun problème.

09

Lire les règles de l'équipe

Vous devez voir : un tableau de six codes, de 0 à 5, avec pour chacun son sens et qui le rend.

Pourquoi ? Pourquoi l'équipe ne choisit-elle pas les codes 1 et 2 pour ses propres échecs ?

Votre réponse :

10

Rendre le bon code

if not dossier.is_dir():
    print("Erreur : dossier introuvable :", dossier)
    sys.exit(3)
python inventaire.py --dossier partages
$LASTEXITCODE

Vous devez voir : Erreur : dossier introuvable : partages, puis 3. Aucun rapport n'est créé.

11

Ajouter le journal

logging.basicConfig(filename="inventaire.log", level=logging.INFO,
                    format="%(asctime)s %(levelname)s %(message)s", encoding="utf-8")
logging.info("Début de l'inventaire de %s", args.dossier)
    logging.error("Dossier introuvable : %s", dossier)
logging.info("Inventaire terminé : %d fichiers, %d octets", len(fichiers), total)

Vous devez voir : le code complet de cette étape est dans l'annexe , partie « Le script à la fin de l'étape 11 ». Comparez le vôtre avec lui, ligne par ligne.

12

Remplir la grille des trois cas

python inventaire.py --dossier partage
python inventaire.py
python inventaire.py --dossier partages
Get-Content inventaire.log -Encoding UTF8
Cas Code de retour Dernière ligne ajoutée au journal, ou « rien »
--dossier partage 0 INFO Inventaire terminé : 20 fichiers, 51600 octets
Cas Code de retour Dernière ligne ajoutée au journal, ou « rien »
sans argument
--dossier partages

Vous devez voir : trois codes différents dans votre grille, et une seule ligne ERROR dans le journal.

Pourquoi ? Pour le lancement sans argument, aucune ligne n'est ajoutée au journal. Regardez l'ordre des lignes du script. Pourquoi ?

Votre réponse :

POINT DE CONTRÔLE B

  • Montrez au formateur votre grille remplie et votre fichier inventaire.log.
  • Le formateur a validé. Passez à la partie C. Inversez les rôles : le lecteur devient pilote.

PARTIE C — Planifier le script

Étapes 13 à 18, environ 30 min. À la fin, Windows lance l'inventaire tout seul, et vous lisez le résultat de chaque exécution.

Besoin d'un rappel ? Revoir le cours : « Lancer le script à heure fixe ».

13

Trouver dans la doc

Vous devez avoir : une commande qui commence par Get-, et un nom de colonne en anglais.

14

Préparer l'action

L'action dit quoi lancer : le programme, ses arguments, et le dossier de départ.

$dossier = (Get-Location).Path
$python = (Get-Command python).Source
$action = New-ScheduledTaskAction -Execute $python -Argument "inventaire.py --dossier partage" -WorkingDirectory $dossier

Vous devez voir : le chemin de votre dossier mdj-scripts, puis un chemin qui finit par python.exe.

Si vous voyez une erreur rouge sur Get-Command python : remplacez python par py dans la deuxième ligne, puis retapez la troisième.

Ces variables vivent dans ce terminal. Si vous le fermez, retapez les trois lignes.

15

Créer la tâche planifiée

Le déclencheur dit quand lancer. Ici, dans une minute, puis toutes les deux minutes pendant deux heures.

$declencheur = New-ScheduledTaskTrigger -Once -At (Get-Date).AddMinutes(1) -RepetitionInterval (New-TimeSpan -Minutes 2) -RepetitionDuration (New-TimeSpan -Hours 2)
Register-ScheduledTask -TaskName "MDJ-inventaire" -Action $action -Trigger $declencheur

Vous devez voir : un petit tableau avec MDJ-inventaire dans la colonne TaskName et Ready dans la colonne State.

Si vous voyez « Accès refusé » : le poste bloque la création de tâches. Appelez le formateur.

16

Lancer la tâche et lire son résultat

Start-ScheduledTask -TaskName "MDJ-inventaire"
Get-ScheduledTaskInfo -TaskName "MDJ-inventaire" | Select-Object LastRunTime, LastTaskResult, NextRunTime

Vous devez voir : l'heure de l'exécution dans LastRunTime, et 0 dans LastTaskResult.

Si vous voyez 267009 : la tâche tourne encore. Attendez dix secondes et recommencez. 267011 veut dire qu'elle n'a pas encore tourné.

Get-Content inventaire.log -Encoding UTF8 -Tail 2

Vous devez voir : deux lignes INFO, à l'heure de LastRunTime.

Pourquoi ? Le Planificateur dit déjà 0. Pourquoi lire aussi le journal ?

Votre réponse :

17

Voir une exécution automatique

Vous devez voir : LastRunTime a changé et vaut l'heure notée. LastTaskResult vaut 0. Personne n'a lancé le script : c'est Windows.

(Get-ChildItem rapports).Count

Vous devez voir : un rapport de plus qu'à l'étape 16.

18

Casser la tâche, puis la supprimer

$action2 = New-ScheduledTaskAction -Execute $python -Argument "inventaire.py --dossier partages" -WorkingDirectory $dossier
Set-ScheduledTask -TaskName "MDJ-inventaire" -Action $action2
Start-ScheduledTask -TaskName "MDJ-inventaire"

Vous devez voir : 3 dans LastTaskResult. Le journal se termine par ERROR Dossier introuvable : partages.

Unregister-ScheduledTask -TaskName "MDJ-inventaire" -Confirm:$false

Vous devez voir : aucun message. La commande Get-ScheduledTask -TaskName "MDJ-inventaire" affiche maintenant une erreur : la tâche n'existe plus.

POINT DE CONTRÔLE C

  • Montrez au formateur les lignes du journal écrites par la tâche, avec leurs heures, et la ligne ERROR de l'étape 18.
  • Le formateur a validé. Passez à la partie D.

PARTIE D — Sauvegarder et restaurer la base

Étapes 19 à 24, environ 30 min. À la fin, vous avez prouvé qu'une sauvegarde de la base des adhérents se restaure à l'identique.

Besoin d'un rappel ? Revoir le cours : « Sauvegarder, et prouver qu'on sait restaurer ».

19

Noter l'état de la base

L'outil verifier_base.py compte les lignes de chaque table et calcule leur empreinte. Son mode d'emploi est dans l'annexe .

python verifier_base.py adherents.db

Vous devez voir : Intégrité : ok, puis une ligne par table : adherent, jeu, emprunt.

20

Écrire le script de sauvegarde

"""Sauvegarde de la base des adhérents dans un fichier .sql daté."""
import sqlite3
from datetime import date

con = sqlite3.connect("adherents.db")
nom = "sauvegarde_" + date.today().isoformat() + ".sql"
with open(nom, "w", encoding="utf-8") as f:
    for ligne in con.iterdump():
        f.write(ligne + "\n")
con.close()
print("Sauvegarde écrite :", nom)

Vous devez voir : Sauvegarde écrite : sauvegarde_ suivi de la date du jour et de .sql.

Get-Content sauvegarde_*.sql -Encoding UTF8 -TotalCount 3

Vous devez voir : BEGIN TRANSACTION;, puis CREATE TABLE adherent (. La sauvegarde est une suite de commandes SQL qui reconstruisent la base.

21

Ranger la copie ailleurs

New-Item -ItemType Directory ..\sauvegardes-mdj
Move-Item sauvegarde_*.sql ..\sauvegardes-mdj

Vous devez voir : ls ..\sauvegardes-mdj affiche votre fichier sauvegarde_….sql.

Pourquoi ? Dans une vraie installation, où faudrait-il ranger ce dossier ? Et pourquoi pas sur le même disque que la base ?

Votre réponse :

22

Simuler la perte de la base

Remove-Item adherents.db
python verifier_base.py adherents.db
$LASTEXITCODE

Vous devez voir : Base introuvable : adherents.db, puis 3.

23

Restaurer la base

L'outil restaurer.py reconstruit une base à partir d'une sauvegarde. Il refuse de remplacer une base qui existe.

$copie = Get-ChildItem ..\sauvegardes-mdj\sauvegarde_*.sql | Select-Object -First 1
python restaurer.py $copie.FullName adherents.db

Vous devez voir : Base restaurée : adherents.db.

24

Prouver la restauration

Table Avant : lignes et empreinte Après : lignes et empreinte Identique ?
adherent
jeu
emprunt

Vous devez voir : les trois lignes identiques. Si une seule diffère, la restauration n'est pas prouvée.

Pourquoi ? Pourquoi comparer les empreintes, et pas seulement vérifier que adherents.db existe de nouveau ?

Votre réponse :

POINT DE CONTRÔLE D

  • Montrez au formateur votre grille « Avant » et « Après », avec les empreintes identiques.
  • Le formateur a validé. Le labo est terminé.

POUR ALLER PLUS LOIN

15 min, si vous avez fini avant la fin de la séance.

1. Le code 5 : droits insuffisants. L'annexe prévoit le code 5 quand le script ne peut pas écrire.

icacls rapports /deny "${env:USERNAME}:(W)"
python inventaire.py --dossier partage
$LASTEXITCODE

Vous devez voir : 5, et une ligne ERROR dans le journal.

icacls rapports /remove:d "$env:USERNAME"

2. Le piège de la base absente. Créez un dossier vide essai, copiez-y sauvegarde.py, et lancez-le depuis ce dossier.

CE QU'IL FAUT RETENIR

  1. Un script se règle par ses arguments. Il se termine par sys.exit avec un code : 0 si tout va bien, le code prévu par l'équipe sinon.
  2. Une tâche planifiée se vérifie sur une vraie exécution : LastTaskResult et la ligne du journal à la même heure.
  3. Une restauration se prouve en comparant les lignes et les empreintes, avant et après, dans une base reconstruite.
Annexes

Tous les documents du module

Cliquez sur une annexe pour l'ouvrir dans le panneau de droite. Elle reste ouverte pendant que vous lisez.