Aller au contenu
Réussir mon BTS SIO

Tape une notion, une commande ou le nom d'une épreuve.

Par exemple

TP1re année19 livrablesQuiz corrigé

Automatiser de petites tâches

Tu sais taper des commandes une par une. Et si la machine les enchaînait toute seule, à ta place ? Bienvenue dans les scripts — ton premier pas de vrai automaticien.

Par Josselyn C., prof de BTS SIO. Publié le , mis à jour le .

Objectif
écrire des scripts PowerShell (et bash) qui enchaînent des commandes, avec variables, questions, conditions, listes et boucles
On manipule
PowerShell sur Windows + bash dans ta VM Linux
Pré-requis
connaître le terminal (cours « Le terminal ») et avoir une VM Linux qui marche
Pour qui
SLAM et SISR, 1re année
Durée
environ 6 h

Compétences : C1.5 Mettre à disposition des utilisateurs un service informatique, C2.1 Concevoir et développer une solution applicative

Un script ne fait rien de dangereux : c'est juste une liste de commandes que tu écris et relis.

Avant de commencer

Pourquoi automatiser

Imagine : chaque matin, tu dois copier des fichiers dans un dossier de sauvegarde, daté du jour. À la main, c'est 5 minutes de clics, tous les jours, à se tromper une fois sur deux. Avec un script, tu écris la procédure une seule fois, et elle se rejoue en une seconde, sans erreur, autant de fois que tu veux. C'est le cœur du métier : faire faire à la machine ce qui est répétitif.

Ce que tu sauras faire à la fin

BriqueTu sauras…
Scriptécrire un fichier de commandes et l'exécuter
Variablestocker et réutiliser une valeur (texte ou nombre)
Questiondemander une info à l'utilisateur
Condition (if, switch)faire réagir le script selon les cas
Listeranger plusieurs valeurs et les parcourir
Bouclerépéter une action sur plein de fichiers
Fonctionréutiliser un bloc de code nommé
Argumentdonner des infos au script au lancement

0. C'est quoi un script ?

Un script est un simple fichier texte qui contient une liste de commandes. Quand tu « lances » ce fichier, l'ordinateur exécute les commandes l'une après l'autre, de haut en bas, comme si tu les avais tapées toi-même — mais d'un coup.

MotDéfinition
Scriptfichier texte contenant une suite de commandes
.ps1l'extension d'un script PowerShell (Windows)
.shl'extension d'un script bash (Linux)
Exécuter« lancer » le script pour que ses commandes se jouent
Variableune boîte nommée qui contient une valeur

Flag A1

Checkpoint

Avec tes mots : quelle est la différence entre taper 5 commandes à la main et les mettre dans un script ? Rends : ta réponse en une à deux phrases.

0 sur 19 dans cette étape

1. Ton premier script PowerShell

On reste sous Windows pour commencer (tu connais déjà PowerShell). On va créer un fichier .ps1 et le lancer.

Étape 1 — Créer le fichier

Dans ton dossier labo-terminal (ou un nouveau dossier scripts), crée un fichier bonjour.ps1 avec le Bloc-notes, ou en commande :

"Write-Host 'Bonjour, je suis ton premier script !'" | Out-File bonjour.ps1

Étape 2 — Le lancer

powershell
.\bonjour.ps1
Ce que tu dois voir
Bonjour, je suis ton premier script !

Flag B1

Production

Crée et lance bonjour.ps1 qui affiche un message de TON choix. Rends : le contenu de ton script, la commande pour le lancer, et ce qui s'affiche.

0 sur 19 dans cette étape

2. Construire le script ligne par ligne

Un script à une ligne, c'est peu. On va le faire grandir. Ouvre bonjour.ps1 dans le Bloc-notes (clic droit → Modifier) et écris plusieurs lignes :

powershell
Write-Host "=== Sauvegarde GSB ==="
Write-Host "Démarrage..."
Write-Host "Terminé !"
Ce que tu dois voir
=== Sauvegarde GSB ===
Démarrage...
Terminé !

Flag B2

Production

Ajoute un commentaire en haut de ton script (qui explique ce qu'il fait) et une 4e ligne d'affichage. Rends : ton script complet et sa sortie.

0 sur 19 dans cette étape

3. Les variables : mémoriser une valeur

Un script devient utile quand il retient des choses. Une variable, c'est une boîte avec un nom, dans laquelle tu ranges une valeur pour la réutiliser.

$nom = "GSB"
Write-Host "Sauvegarde de l'entreprise $nom"
Ce que tu dois voir
Sauvegarde de l'entreprise GSB

Une variable bien pratique : la date du jour

$date = Get-Date -Format "yyyy-MM-dd"
Write-Host "Nous sommes le $date"
Ce que tu dois voir
Nous sommes le 2026-09-21

Les types de variables essentiels

PowerShell est dit « à typage dynamique » : il devine le type selon ce que tu mets. Mais tu peux aussi forcer le type pour éviter les surprises.

TypeDéclarationExemplePiège si absent
[string][string]$nom = "GSB"texteun nombre peut se coller au lieu de s'additionner
[int][int]$age = 18entier (−2 milliards à +2 milliards)une saisie Read-Host reste du texte sans ça
[double][double]$prix = 19.99décimal[int]19.99 → 20 (arrondi !)
[bool][bool]$actif = $truevrai/faux ($true / $false)les comparaisons -eq renvoient un bool — tu peux le stocker
[datetime][datetime]$d = "2026-09-01"date manipulableGet-Date renvoie un datetime — -Format le transforme en string

Les variables d'environnement — lire le contexte du système

PowerShell expose les variables système via $env:. Pratique pour personnaliser un script sans rien coder en dur :

powershell
Write-Host "Tu es connecté en tant que : $env:USERNAME"
Write-Host "Ton poste s'appelle       : $env:COMPUTERNAME"
Write-Host "Ton dossier perso         : $env:USERPROFILE"
Ce que tu dois voir
Tu es connecté en tant que : marc.dupont
Ton poste s'appelle       : PC-SALLE3-12
Ton dossier perso         : C:\Users\marc.dupont

Flag B3

Production

Crée deux variables : $prenom (le tien) et $date (la date du jour). Affiche : « <prenom> a fait sa sauvegarde le <date> ». Rends : ton script et sa sortie.

0 sur 19 dans cette étape

4. Texte & nombres : les types et les calculs

Une variable peut contenir deux grandes sortes de valeurs : du texte (« GSB », « Marc ») ou des nombres (18, 3.5). Et elles ne se comportent pas pareil — c'est une notion clé de toute programmation.

Les nombres : on peut calculer

$a = 10
$b = 3
Write-Host "Somme : $($a + $b)"
Write-Host "Produit : $($a * $b)"
Ce que tu dois voir
Somme : 13
Produit : 30

Le texte : on assemble (mais on ne calcule pas)

$prenom = "Marc"
$nom = "Dupont"
Write-Host ($prenom + " " + $nom)
Ce que tu dois voir
Marc Dupont

Guillemets doubles vs guillemets simples — une distinction clé

En PowerShell (et en bash), les guillemets ne font pas la même chose :

GuillemetsComportementExempleRésultat
"..." doublesPowerShell interprète les $variables et les $(expressions)"Bonjour $nom"Bonjour Marc
'...' simplesTout est littéral — aucune substitution, le $ reste tel quel'Bonjour $nom'Bonjour $nom
$nom = "Marc"
Write-Host "Bonjour $nom"   # → Bonjour Marc   (interpolation)
Write-Host 'Bonjour $nom'   # → Bonjour $nom   (littéral)

Couper, assembler, extraire — les outils texte du pro

OpérationPowerShellExemple + résultat
Longueur$nom.Length"Marc".Length → 4
Majuscules / minuscules$nom.ToUpper() / .ToLower()"marc".ToUpper() → MARC
Remplacer$nom.Replace("a","@")"marc".Replace("a","@") → m@rc
Couper en morceaux$ligne -split ",""marc,sophie,karim" -split "," → liste de 3
Coller une liste$liste -join " - "@("A","B","C") -join " - " → A - B - C
Commencer par…$nom.StartsWith("Ma")"Marc".StartsWith("Ma") → True
Contient…$nom -like "*ar*""Marc" -like "*ar*" → True (* = n'importe quoi)

Flag B4

Production

Crée $a = 7 et $b = 5. Affiche, sur trois lignes, leur somme, leur produit et leur différence — en t'assurant que ce sont bien des calculs (pas des collages). Rends : ton script et sa sortie.

0 sur 19 dans cette étape

5. Poser une question

Un script encore plus malin demande une info à celui qui le lance.

$reponse = Read-Host "Quel dossier veux-tu sauvegarder ?"
Write-Host "Tu as choisi : $reponse"
Ce que tu dois voir
Quel dossier veux-tu sauvegarder ?: Documents
Tu as choisi : Documents

Flag B5

Production

Écris un script qui demande le prénom de l'utilisateur, puis affiche un message d'accueil personnalisé. Rends : ton script et un exemple d'exécution.

0 sur 19 dans cette étape

6. Les conditions : réagir selon les cas

Un script intelligent fait des choix : « SI telle situation, ALORS fais ceci, SINON fais cela ». C'est le if / else.

$dossier = Read-Host "Nom du dossier à sauvegarder"
if (Test-Path $dossier) {
    Write-Host "OK, le dossier existe, je sauvegarde."
} else {
    Write-Host "Erreur : ce dossier n'existe pas !"
}

Comparer deux valeurs : les opérateurs

Le plus souvent, le test du if compare deux valeurs : un nombre est-il plus grand qu'un autre ? deux textes sont-ils égaux ? Surprise : en PowerShell on n'écrit pas > ni ==, mais des mots-clés qui commencent par un tiret.

OpérateurSensVrai quand…
-eqégal à5 -eq 5
-nedifférent de5 -ne 3
-gtplus grand que5 -gt 3
-geplus grand ou égal5 -ge 5
-ltplus petit que3 -lt 5
-leplus petit ou égal3 -le 5
$age = Read-Host "Quel age as-tu ?"
if ([int]$age -ge 18) {
    Write-Host "Tu es majeur."
} else {
    Write-Host "Tu es mineur."
}
Ce que tu dois voir
Quel age as-tu ?: 20
Tu es majeur.

Plusieurs cas : elseif

$note = [int](Read-Host "Ta note sur 20 ?")
if ($note -ge 16) {
    Write-Host "Très bien"
} elseif ($note -ge 10) {
    Write-Host "Admis"
} else {
    Write-Host "À retravailler"
}
Ce que tu dois voir
Ta note sur 20 ?: 12
Admis

Combiner plusieurs conditions : -and, -or, -not

Parfois un seul test ne suffit pas : « SI l'âge est ≥ 18 ET le pays est France… ». Les opérateurs logiques combinent plusieurs conditions.

OpérateurSensVrai quand…
-andET — les deux doivent être vrais($age -ge 18) -and ($pays -eq "France")
-orOU — au moins un doit être vrai($ext -eq ".jpg") -or ($ext -eq ".png")
-notNON — inverse le résultat-not (Test-Path $dossier) = dossier absent
$age = [int](Read-Host "Ton âge ?")
$pass = Read-Host "Ton code (1234) ?"

if ($age -ge 18 -and $pass -eq "1234") {
    Write-Host "Accès autorisé."
} elseif ($age -lt 18) {
    Write-Host "Accès refusé : tu es mineur."
} else {
    Write-Host "Accès refusé : code incorrect."
}
Ce que tu dois voir
Ton âge ?: 20
Ton code (1234) ?: 9999
Accès refusé : code incorrect.

Flag C1

Debug

Reprends le script de note ci-dessus, lance-le trois fois (une note ≥ 16, une entre 10 et 15, une < 10). Rends : les trois messages obtenus, et explique ce qui décide du message affiché.

0 sur 19 dans cette étape

7. Le switch : choisir parmi plein de cas

Quand tu dois tester la même variable contre beaucoup de valeurs, enchaîner les elseif devient lourd. Le switch fait ça plus proprement : « regarde cette valeur, et selon ce qu'elle vaut, fais le bon bloc ».

$jour = [int](Read-Host "Numéro du jour (1-7) ?")
switch ($jour) {
    1 { Write-Host "Lundi" }
    2 { Write-Host "Mardi" }
    3 { Write-Host "Mercredi" }
    4 { Write-Host "Jeudi" }
    5 { Write-Host "Vendredi" }
    6 { Write-Host "Samedi" }
    7 { Write-Host "Dimanche" }
    default { Write-Host "Numéro invalide (attendu 1 à 7)" }
}
Ce que tu dois voir
Numéro du jour (1-7) ?: 3
Mercredi

Flag B6

Production

Écris un petit menu : demande un numéro (1, 2 ou 3) et, avec un switch, affiche « Sauvegarde », « Restauration » ou « Quitter ». Ajoute un default pour les autres saisies. Rends : ton script et trois exécutions (1, 2, et une valeur invalide).

0 sur 19 dans cette étape

8. Les listes (tableaux) : ranger plusieurs valeurs

Jusqu'ici, une variable contenait une valeur. Mais souvent tu veux en ranger plusieurs : la liste des visiteurs, des fichiers à traiter… C'est une liste (on dit aussi « tableau »).

Créer une liste et lire ses éléments

$visiteurs = @("Marc", "Sophie", "Karim")
Write-Host "Premier visiteur : $($visiteurs[0])"
Write-Host "Nombre de visiteurs : $($visiteurs.Count)"
Ce que tu dois voir
Premier visiteur : Marc
Nombre de visiteurs : 3

Ajouter un élément

$visiteurs += "Lina"
Write-Host "Maintenant : $($visiteurs.Count) visiteurs"
Ce que tu dois voir
Maintenant : 4 visiteurs

Parcourir toute la liste

foreach ($v in $visiteurs) {
    Write-Host "- $v"
}
Ce que tu dois voir
- Marc
- Sophie
- Karim
- Lina

Flag B7

Production

Crée une liste $courses avec 3 articles. Ajoute-en un 4e avec +=. Puis affiche, avec une boucle foreach, « Article : <nom> » pour chacun, et à la fin le nombre total d'articles. Rends : ton script et sa sortie.

0 sur 19 dans cette étape

9. Les boucles sur des fichiers

La vraie puissance : faire la même action sur plein d'éléments réels — par exemple tous les fichiers d'un dossier. On combine une liste de fichiers et une boucle.

$fichiers = Get-ChildItem *.txt
foreach ($f in $fichiers) {
    Write-Host "Trouvé : $($f.Name)"
}
Ce que tu dois voir
Trouvé : note.txt
Trouvé : moi.txt
Trouvé : rapport.txt

Les propriétés utiles d'un fichier (tableau de référence)

PropriétéTypeValeur exempleUsage type
$f.Nametexterapport.txtAfficher, renommer
$f.FullNametexteC:\scripts\rapport.txtCopier, déplacer, supprimer — toujours utiliser FullName, jamais Name seul dans une commande de fichier
$f.Extensiontexte.txtFiltrer par type (inclut le point : ".txt", pas "txt")
$f.Lengthentier (octets)4096Filtrer par taille — divise par 1KB, 1MB ou 1GB pour avoir des unités lisibles
$f.LastWriteTimedatetime2026-09-20 14:32Trier, supprimer les anciens (ex. logs de plus de 30 jours)
$f.CreationTimedatetime2026-09-01 09:00Dater une archive, tracer la création
$f.AttributesflagsHidden, ReadOnlyDétecter les fichiers cachés ou en lecture seule
$f.Directoryobjet dossierC:\scriptsRemonter au dossier parent

Exemple pro — nettoyer les logs de plus de 30 jours

Cas réel : un serveur GSB accumule des journaux d'application dans C:\Logs. Chaque nuit, un script supprime ceux de plus de 30 jours pour éviter de saturer le disque. C'est une des automatisations les plus demandées en entreprise.

# Nettoyage automatique des logs GSB (script pro)
$dossierLogs = "C:\Logs"
$limiteJours = 30
$dateButoir  = (Get-Date).AddDays(-$limiteJours)
$supprimés   = 0

Get-ChildItem -Path $dossierLogs -Filter *.log -File |
    Where-Object { $_.LastWriteTime -lt $dateButoir } |
    ForEach-Object {
        Remove-Item $_.FullName
        $supprimés++
    }

Write-Host "$supprimés log(s) supprimé(s) antérieurs au $($dateButoir.ToString('yyyy-MM-dd'))"
Ce que tu dois voir
3 log(s) supprimé(s) antérieurs au 2026-08-03

Flag B8

Production

Écris une boucle qui affiche le nom et la taille de chaque fichier .txt de ton dossier (indice : $($f.Name) et $($f.Length)). Rends : ton script et sa sortie.

0 sur 19 dans cette étape

10. D'autres boucles : compter et répéter

Le foreach parcourt une liste. Mais parfois on veut compter (de 1 à 10) ou répéter tant qu'une condition est vraie. Deux autres boucles pour ça.

La boucle for : compter

for ($i = 1; $i -le 5; $i++) {
    Write-Host "Tour numéro $i"
}
Ce que tu dois voir
Tour numéro 1
Tour numéro 2
Tour numéro 3
Tour numéro 4
Tour numéro 5

La boucle while : tant que…

$compte = 3
while ($compte -gt 0) {
    Write-Host "Décollage dans $compte..."
    $compte = $compte - 1
}
Write-Host "Décollage !"
Ce que tu dois voir
Décollage dans 3...
Décollage dans 2...
Décollage dans 1...
Décollage !

La boucle do…while : exécuter au moins une fois

Avec while, si la condition est fausse dès le départ, le bloc ne s'exécute jamais. do…while garantit un premier passage, puis vérifie la condition :

do {
    $reponse = Read-Host "Tape 'ok' pour continuer"
} while ($reponse -ne "ok")
Ce que tu dois voir
Tape 'ok' pour continuer: non
Tape 'ok' pour continuer: peut-être
Tape 'ok' pour continuer: ok
(suite du script)

Générer une plage de nombres : 1..10

PowerShell a un raccourci pratique pour créer une suite de nombres sans écrire une boucle for :

# Afficher les nombres de 1 à 5
1..5 | ForEach-Object { Write-Host "Tour $_" }

# Créer 5 dossiers nommés "labo-1" à "labo-5"
1..5 | ForEach-Object { New-Item -ItemType Directory -Name "labo-$_" | Out-Null }
Write-Host "5 dossiers créés."
Ce que tu dois voir
5 dossiers créés.

Tableau comparatif — quelle boucle choisir ?

BoucleQuand l'utiliserPoint clé
foreach ($x in $liste)Parcourir une liste (fichiers, noms, lignes…) dont la taille est déjà connueLe plus lisible pour les collections
for ($i=1; …; $i++)Compter (de A à B), ou quand tu as besoin du numéro de tour dans le blocUtile pour indexer ($liste[$i])
while (condition)Répéter tant qu'une condition extérieure est vraie (téléchargement, attente de réponse)Peut ne jamais s'exécuter si la condition est fausse d'emblée
do { } while (condition)Toujours exécuter au moins une fois (valider une saisie)La vérification a lieu après le premier passage
1..N | ForEach-ObjectGénérer une série rapide sans déclarer de compteurLisible pour créer N éléments d'un coup

Flag B9

Production

Écris une boucle for qui affiche la table de multiplication de 7 (de 7×1 à 7×10). Rends : ton script et sa sortie.

0 sur 19 dans cette étape

11. Les fonctions : réutiliser un bloc

Quand tu fais plusieurs fois la même chose dans un script, tu ne réécris pas le code à chaque fois : tu en fais une fonction — un bloc nommé, que tu appelles autant que tu veux. C'est une brique majeure de la programmation.

Définir et appeler une fonction

function Saluer {
    param($nom)
    Write-Host "Bonjour $nom, bienvenue chez GSB !"
}

Saluer "Marc"
Saluer "Sophie"
Ce que tu dois voir
Bonjour Marc, bienvenue chez GSB !
Bonjour Sophie, bienvenue chez GSB !

Une fonction qui RENVOIE un résultat

function CalculerTTC {
    param($prixHT)
    return $prixHT * 1.20
}

$total = CalculerTTC 100
Write-Host "Prix TTC : $total euros"
Ce que tu dois voir
Prix TTC : 120 euros

Rendre les paramètres robustes : typage et obligation

Pour les scripts qu'on partage ou qu'on automatise, il faut que la fonction refuse de fonctionner si on lui passe n'importe quoi. PowerShell permet de typer les paramètres et de les rendre obligatoires :

function CalculerTVA {
    param(
        [Parameter(Mandatory=$true)]
        [double]$prixHT,

        [double]$tauxTVA = 0.20   # valeur par défaut = 20%
    )
    return [math]::Round($prixHT * (1 + $tauxTVA), 2)
}

CalculerTVA 100           # → 120.0  (taux par défaut)
CalculerTVA 100 0.055     # → 105.5  (TVA réduite 5,5%)
CalculerTVA               # → PowerShell demande le prixHT !
Ce que tu dois voir
120
105.5
Fournissez des valeurs pour les paramètres suivants :
prixHT : 

Le return implicite — PowerShell est différent de C#

Flag B10

Production

Écris une fonction EstMajeur qui prend un âge en paramètre et affiche « majeur » ou « mineur » (avec un if dedans). Appelle-la avec trois âges différents. Rends : ta fonction et les trois résultats.

0 sur 19 dans cette étape

12. Donner des arguments au script lui-même

Jusqu'ici, soit ton script demandait les infos avec Read-Host, soit elles étaient écrites « en dur ». Mais un vrai outil de pro se lance avec ses infos dès la ligne de commande — comme Copy-Item source destination. Ces infos passées au lancement s'appellent des arguments.

param() en tête de script

Crée salut.ps1 avec, tout en haut (première instruction !) :

param($prenom, $ville)
Write-Host "Salut $prenom, tu viens de $ville !"

Lancer le script avec ses arguments

powershell
.\salut.ps1 Marc Lyon
Ce que tu dois voir
Salut Marc, tu viens de Lyon !

Tu peux aussi nommer les arguments (l'ordre n'importe plus) :

powershell
.\salut.ps1 -ville Paris -prenom Sophie
Ce que tu dois voir
Salut Sophie, tu viens de Paris !

Et si je ne sais pas combien d'arguments ? $args

# compte.ps1
Write-Host "Tu as passé $($args.Count) argument(s)."
foreach ($a in $args) {
    Write-Host "- $a"
}
Ce que tu dois voir
PS> .\compte.ps1 pomme poire kiwi
Tu as passé 3 argument(s).
- pomme
- poire
- kiwi

Flag B11

Production

Écris infodossier.ps1 qui prend en argument un nom de dossier (param($dossier)), vérifie qu'il existe (Test-Path), et affiche le nombre de fichiers qu'il contient (indice : (Get-ChildItem $dossier).Count). Lance-le ainsi : .\infodossier.ps1 Documents. Rends : ton script et deux exécutions (un dossier qui existe, un qui n'existe pas).

0 sur 19 dans cette étape

13. Lire et écrire des fichiers dans un script

Un script devient vraiment puissant quand il traite des fichiers : lire une liste, écrire un journal (un « log »). C'est le quotidien de l'administration système.

Lire un fichier ligne par ligne

Crée d'abord un fichier visiteurs.txt avec quelques noms (un par ligne), puis :

$lignes = Get-Content visiteurs.txt
foreach ($ligne in $lignes) {
    Write-Host "Visiteur : $ligne"
}
Ce que tu dois voir
Visiteur : Marc
Visiteur : Sophie
Visiteur : Karim

Écrire dans un journal (log) daté

$date = Get-Date -Format "yyyy-MM-dd HH:mm"
"[$date] Script lancé" | Add-Content journal.log

Les 4 cmdlets de fichiers — tableau complet

CmdletCe qu'il faitÉquivalent bashPiège à éviter
Get-Content fichierLit le fichier → liste de lignescat fichierLire un fichier de 500 Mo charge tout en RAM — préfère Get-Content -ReadCount 100 pour lire par lots
Set-Content fichierÉcrase le fichier avec le nouveau contenuecho "..." > fichierDétruit tout l'historique — jamais sur un log
Add-Content fichierAjoute à la fin (le fichier grandit)echo "..." >> fichierSans -Encoding UTF8, peut écrire en UTF-16 — lisible sous Windows mais illisible sous Linux
Out-File fichierRedirige la sortie d'une commande vers un fichiercommande > fichierPar défaut, Out-File écrase — ajoute -Append pour cumuler

Lire un CSV structuré : Import-Csv

Un fichier CSV a des colonnes nommées. Get-Content renvoie des lignes brutes de texte que tu dois découper à la main avec -split. Import-Csv fait ça automatiquement et renvoie des objets dotés de propriétés nommées selon l'en-tête — le gain de temps est énorme.

Crée le fichier visiteurs.csv (Bloc-notes, colle ces lignes, enregistre) :

Prenom,Nom,Service
Marc,Dupont,Informatique
Sophie,Martin,Comptabilité
Karim,Benali,Direction

Lis-le avec Import-Csv :

$visiteurs = Import-Csv visiteurs.csv
foreach ($v in $visiteurs) {
    Write-Host "$($v.Prenom) $($v.Nom) — service : $($v.Service)"
}
Ce que tu dois voir
Marc Dupont — service : Informatique
Sophie Martin — service : Comptabilité
Karim Benali — service : Direction

Get-Content vs Import-Csv — quand choisir quoi ?

Get-ContentImport-Csv
Format du fichierN'importe quel texte (log, config, liste brute)CSV avec en-tête (colonnes nommées)
Ce qu'on récupèreListe de chaînes de texte, une par ligneListe d'objets avec propriétés nommées
Accès à un champDécoupe manuelle : $l -split "," puis [0], [1]…Direct : $v.Prenom, $v.Service
SéparateurTu gères toi-mêmeVirgule par défaut ; -Delimiter ";" pour les CSV Excel France
Cas d'usage typiqueLire un log, traiter un fichier texte non structuréImporter une liste d'utilisateurs, de postes, de visiteurs

Flag B12

Production

Crée un fichier taches.txt (3-4 tâches, une par ligne). Écris un script qui lit le fichier et affiche « À faire : <tâche> » pour chacune, en numérotant (indice : un compteur $n que tu incrémentes). Rends : ton script et sa sortie.

0 sur 19 dans cette étape

14. Quand ça plante : lire l'erreur & déboguer

Tous les scripts plantent un jour. Ce qui fait le bon technicien, ce n'est pas de ne jamais se tromper : c'est de savoir lire l'erreur et la corriger calmement.

Décoder un message d'erreur

Ce que tu dois voir
Set-Location : Impossible de trouver le chemin « C:\labo\absent »...
Au caractère C:\scripts\sauvegarde.ps1:6 : 5

La technique du « jalon » (tracer)

Quand un script fait un truc bizarre sans planter, sème des repères pour voir jusqu'où il va :

powershell
Write-Host "1 - avant la copie"
Copy-Item "$source\*" $destination -Recurse
Write-Host "2 - après la copie"

Attraper une erreur proprement : try / catch

try {
    Copy-Item "$source\*" $destination -Recurse
    Write-Host "Sauvegarde réussie."
} catch {
    Write-Host "Échec : $($_.Exception.Message)"
}

Contrôler le comportement sur erreur : $ErrorActionPreference

Par défaut, PowerShell affiche l'erreur en rouge mais continue l'exécution. Dans un script automatisé, c'est dangereux : si la copie rate, le script continue et « confirme » une sauvegarde qui n'a pas eu lieu.

# En haut du script, force l'arrêt immédiat sur toute erreur :
$ErrorActionPreference = "Stop"

try {
    Copy-Item "$source\*" $destination -Recurse
    Write-Host "Sauvegarde réussie."
} catch {
    Write-Host "ÉCHEC : $($_.Exception.Message)"
    exit 1   # code de retour 1 = erreur (utile pour les tâches planifiées)
}

Tester sans casser : -WhatIf

Beaucoup de cmdlets « destructifs » (Move-Item, Remove-Item, Copy-Item, Set-Content…) acceptent -WhatIf : ils simulent l'action et disent ce qu'ils auraient fait, sans rien toucher.

powershell
Remove-Item "*.log" -WhatIf
Ce que tu dois voir
WhatIf : Opération « Suppression de l'élément » en cours sur la cible « C:\scripts\debug.log ».
WhatIf : Opération « Suppression de l'élément » en cours sur la cible « C:\scripts\journal.log ».

Tracer ce que fait un script : Write-Verbose

$VerbosePreference = "Continue"   # active les messages verbose

function SauvegarderDossier {
    param([string]$source)
    Write-Verbose "Vérification du dossier source : $source"
    if (-not (Test-Path $source)) {
        Write-Error "Dossier introuvable : $source"
        return
    }
    Write-Verbose "Démarrage de la copie..."
    Copy-Item $source "backup-$(Get-Date -Format 'yyyyMMdd')" -Recurse
    Write-Verbose "Copie terminée."
    Write-Host "Sauvegarde réussie."
}

Connaître son environnement : $PSVersionTable

Avant de déboguer, sache dans quelle version de PowerShell tu travailles. Les comportements varient entre PS 5.1 (intégré à Windows) et PS 7+ (à installer séparément) :

$PSVersionTable
Ce que tu dois voir
Name                           Value
----                           -----
PSVersion                      5.1.19041.4291
PSEdition                      Desktop
BuildVersion                   10.0.19041.4291
CLRVersion                     4.0.30319.42000
CritèreWindows PowerShell 5.1PowerShell 7.x
Présence sur WindowsIntégré (toujours là)À installer séparément
Encodage Add-ContentUTF-16 par défaut (pose problème côté Linux)UTF-8 par défaut (compatible partout)
Opérateur ternaireNon disponible$x = condition ? "oui" : "non"
Modules AD/ExchangeDisponibles nativementNon disponibles sans passerelle
Support actifMaintenance sécu. uniquementDéveloppement actif (nouvelles fonctions)

Mode trace — suivre l'exécution ligne par ligne

Quand un script se comporte de façon inattendue et que tu ne sais pas quelle ligne est en cause, active le mode trace :

powershell
Set-PSDebug -Trace 1   # active : chaque ligne est affichée avant exécution
.\monscript.ps1
Set-PSDebug -Off       # désactive : revient au mode normal
Ce que tu dois voir
DEBUG:    1+  >>>> $source = Read-Host "Quel dossier ?"
DEBUG:    2+  >>>> if (Test-Path $source) {
DEBUG:    3+  >>>>     Copy-Item "$source\*" $destination -Recurse

Flag C2

Debug

Prends un de tes scripts, introduis volontairement une faute (ex. enlève une accolade fermante, ou écris mal un nom de variable). Rends : le message d'erreur exact obtenu, la ligne indiquée, et la correction qui répare.

0 sur 19 dans cette étape

15. Un vrai script utile : la sauvegarde datée

On assemble tout pour résoudre le problème du début : sauvegarder un dossier dans une copie datée du jour. Voici le script complet, commenté.

# Sauvegarde datée d'un dossier — GSB
$source = Read-Host "Quel dossier sauvegarder ?"

if (Test-Path $source) {
    $date = Get-Date -Format "yyyy-MM-dd"
    $destination = "sauvegarde-$date"
    New-Item -ItemType Directory -Name $destination | Out-Null
    Copy-Item "$source\*" $destination -Recurse
    Write-Host "Sauvegarde de '$source' faite dans '$destination'."
} else {
    Write-Host "Le dossier '$source' n'existe pas. Abandon."
}

Version robuste — ce qu'on met en production

La version ci-dessus est pédagogique. Un script qui tourne seul toutes les nuits sans que personne le surveille doit gérer les pannes, journaliser ses actions et signaler les erreurs. Voici ce que devient ce script en conditions réelles :

# sauvegarde-robuste.ps1 — GSB production
param(
    [Parameter(Mandatory=$true)]
    [string]$source,
    [string]$racine = "C:\Sauvegardes"
)

$ErrorActionPreference = "Stop"
$date        = Get-Date -Format "yyyy-MM-dd_HHmm"
$destination = Join-Path $racine "sauvegarde-$date"
$log         = Join-Path $racine "sauvegarde.log"

function Journaliser {
    param([string]$msg)
    $h = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
    "[$h] $msg" | Add-Content $log -Encoding UTF8
    Write-Host $msg
}

try {
    if (-not (Test-Path $source)) {
        throw "Dossier source introuvable : $source"
    }
    New-Item -ItemType Directory -Path $destination | Out-Null
    Copy-Item "$source\*" $destination -Recurse

    $nbFichiers = (Get-ChildItem $destination -Recurse -File).Count
    Journaliser "SUCCES — $nbFichiers fichier(s) dans $destination"
    exit 0
}
catch {
    Journaliser "ECHEC — $($_.Exception.Message)"
    exit 1
}
Ce que tu dois voir
PS> .\sauvegarde-robuste.ps1 -source Documents
[2026-09-21 22:00:03] SUCCES — 47 fichier(s) dans C:\Sauvegardes\sauvegarde-2026-09-21_2200

Flag B13

Production

Crée et teste ce script de sauvegarde sur un de tes dossiers (ex. brouillons). Rends : le nom du dossier de sauvegarde créé (avec la date) et la preuve (ls) que les fichiers ont bien été copiés.

0 sur 19 dans cette étape

16. Le même esprit côté Linux (bash)

Tout ce que tu viens d'apprendre existe aussi en bash, avec une syntaxe un peu différente. Apprendre l'un te donne 80 % de l'autre. Dans ta VM Linux, crée bonjour.sh :

#!/bin/bash
nom="GSB"
echo "Bonjour depuis le script $nom"

Le rendre exécutable, puis le lancer

bash
chmod +x bonjour.sh
./bonjour.sh
Ce que tu dois voir
Bonjour depuis le script GSB

Demander une info : read

#!/bin/bash
read -p "Ton prénom ? " prenom
echo "Bonjour $prenom !"
Ce que tu dois voir
Ton prénom ? Marc
Bonjour Marc !

La condition en bash : if … then … fi

#!/bin/bash
read -p "Ton âge ? " age
if [ "$age" -ge 18 ]; then
    echo "Tu es majeur."
else
    echo "Tu es mineur."
fi
Ce que tu dois voir
Ton âge ? 20
Tu es majeur.

La boucle for en bash

#!/bin/bash
for fichier in *.txt; do
    echo "Trouvé : $fichier"
done
Ce que tu dois voir
Trouvé : note.txt
Trouvé : rapport.txt

Une fonction en bash

#!/bin/bash
saluer() {
    echo "Bonjour $1, bienvenue chez GSB !"
}

saluer "Marc"
saluer "Sophie"
Ce que tu dois voir
Bonjour Marc, bienvenue chez GSB !
Bonjour Sophie, bienvenue chez GSB !

Les variables spéciales bash — ce que le script sait sur lui-même

powershell
#!/bin/bash
echo "Nom du script    : $0"
echo "Nbre d'arguments : $#"
echo "Tous les args    : $@"
echo "1er argument     : $1"
echo "Code retour préc : $?"
#!/bin/bash
cp "$1" "$2"
if [ $? -ne 0 ]; then
    echo "ERREUR : la copie a échoué."
    exit 1
fi
echo "Copie réussie."
Ce que tu dois voir
ERREUR : la copie a échoué.

Vérifier le nombre d'arguments — réflexe de robustesse

#!/bin/bash
# sauvegarde.sh  source  destination
if [ $# -ne 2 ]; then
    echo "Usage : $0  "
    exit 1
fi
cp -r "$1" "$2"
echo "Copié : $1 → $2"
Ce que tu dois voir
$ ./sauvegarde.sh documents
Usage : ./sauvegarde.sh <source> <destination>

Tableau comparatif complet — PowerShell vs bash

NotionPowerShellbashDifférence clé
Shebang(aucun — l'extension .ps1 suffit)#!/bin/bash en ligne 1bash : obligatoire ; PowerShell : superflu
Rendre exécutableSet-ExecutionPolicy (une fois)chmod +x script.sh (par fichier)PS : politique globale ; bash : droit fichier
Lancer.\script.ps1./script.shBackslash vs slash (Windows vs Linux)
Variable — créer$nom = "val"nom="val" (sans espaces ni $)bash : $ seulement à la LECTURE, pas à l'écriture
Variable — lire$nom$nomIdentique
AfficherWrite-Host "..."echo "..."Identique dans le comportement
DemanderRead-Host "?"read -p "?" varbash : le nom de la variable est l'argument de read
Conditionif (...) { } else { }if [ ... ]; then ... else ... fibash : crochets + espaces obligatoires + fi
Opérateurs num.-eq -ne -gt -ge -lt -le-eq -ne -gt -ge -lt -leIdentiques !
Opérateurs texte-eq -ne (insensible casse)= != (dans les crochets)bash : guillemets autour de "$var" obligatoires
Boucle listeforeach ($f in $l) { }for f in liste; do ... donebash : do/done au lieu des accolades
Boucle compteurfor ($i=1; $i -le 5; $i++) { }for i in {1..5}; do ... donebash : plage {1..5} très compacte
Fonction — déf.function F { param($a) }f() { local a=$1 }bash : pas de param(), tout dans $1 $2…
Arguments scriptparam($a, $b) ou $args$1 $2 … $# $@ $0bash : variables auto sans déclaration
Code retourexit 0 / exit 1exit 0 / exit 1 + $?bash : $? disponible après chaque commande
Guillemets"..." = interprète, '...' = littéral"..." = interprète, '...' = littéralIdentiques !
Lire un fichierGet-Content fichiercat fichier ou while IFS= read -r lignebash : boucle while read pour les gros fichiers
Écrire (ajouter)Add-Content fichier -Encoding UTF8echo "..." >> fichierbash : toujours UTF-8, pas de problème d'encodage

Flag D1

Investigation

En bash, on teste l'existence d'un dossier avec -d (indice : if [ -d "$dossier" ]; then ... fi). Cherche aussi le test -f (existence d'un fichier). Rends : ce que vérifient -d et -f, et une phrase sur leur différence.

0 sur 19 dans cette étape

Flag B14

Production (bash)

Écris accueil.sh qui : demande un prénom (read), puis avec un if affiche « Salut le chef ! » si le prénom est « Marc », sinon « Bienvenue <prénom> ». Termine par une boucle for qui affiche les noms de tous les .sh du dossier. Rends : ton script, la commande chmod, et deux exécutions (avec « Marc » et avec un autre prénom).

0 sur 19 dans cette étape

17. Mini-projet : ton assistant de rangement

Mission : un script PowerShell qui range automatiquement les fichiers d'un dossier par type, et fait un petit rapport. Tu vas réunir presque toutes les briques : argument/question, condition, switch, liste, boucle, compteur.

Le cahier des charges

  1. Demande à l'utilisateur le dossier à ranger (Read-Host) — ou prends-le en argument (param).
  2. Vérifie qu'il existe (if/Test-Path), sinon arrête avec un message.
  3. Crée (s'ils n'existent pas) trois sous-dossiers : textes, images, autres.
  4. Parcourt les fichiers (foreach) et déplace chacun selon son extension (.txt → textes, .jpg/.png → images, le reste → autres).
  5. Affiche combien de fichiers ont été rangés.

Flag B15

Mini-projet (production)

Écris et teste ton assistant de rangement sur un dossier rempli de fichiers variés. Rends : ton script complet et le ls -Recurse final qui montre les fichiers rangés par type + le total affiché.

0 sur 19 dans cette étape

18. Planifier l'exécution automatique

Écrire un script, c'est bien. Le faire tourner tout seul, sans intervention humaine, à heure fixe chaque nuit, c'est le vrai objectif de l'automatisation. Deux outils selon l'OS : le Gestionnaire de tâches (Windows) et cron (Linux).

Windows — Gestionnaire de tâches (Task Scheduler)

Le Gestionnaire de tâches (taskschd.msc en interface graphique) permet de lancer un programme à une heure précise, au démarrage, ou à intervalle fixe. En PowerShell, on le configure entièrement en ligne de commande — idéal pour l'automatiser sur 100 postes d'un coup.

# Planifier la sauvegarde GSB chaque nuit à 22h
$action = New-ScheduledTaskAction `
    -Execute "powershell.exe" `
    -Argument "-NonInteractive -File C:\scripts\sauvegarde-robuste.ps1 -source C:\Users\Public\Documents"

$trigger = New-ScheduledTaskTrigger -Daily -At "22:00"

$settings = New-ScheduledTaskSettingsSet `
    -ExecutionTimeLimit (New-TimeSpan -Hours 1) `
    -StartWhenAvailable

Register-ScheduledTask `
    -TaskName "GSB-Sauvegarde-Nuit" `
    -Action $action `
    -Trigger $trigger `
    -Settings $settings `
    -RunLevel Highest `
    -Force
Ce que tu dois voir
TaskPath  TaskName             State    Enabled
--------  --------             -----    -------
\         GSB-Sauvegarde-Nuit  Ready    True

Gérer ses tâches planifiées en ligne de commande

ActionCommande PowerShell
Voir toutes les tâchesGet-ScheduledTask
Détail + dernier résultatGet-ScheduledTaskInfo "GSB-Sauvegarde-Nuit" — LastTaskResult : 0 = succès
Lancer manuellementStart-ScheduledTask -TaskName "GSB-Sauvegarde-Nuit"
Désactiver (pause)Disable-ScheduledTask -TaskName "GSB-Sauvegarde-Nuit"
SupprimerUnregister-ScheduledTask -TaskName "GSB-Sauvegarde-Nuit" -Confirm:$false

Linux — cron et crontab

Sous Linux, c'est le démon cron qui gère les tâches planifiées. Chaque utilisateur a son crontab, un fichier de tâches édité avec crontab -e.

La syntaxe cron — 5 champs

#  min  heure  jour_du_mois  mois  jour_semaine   commande
   0    22     *             *     *              /bin/bash /home/marc/sauvegarde.sh
Expression cronSignification
0 22 * * *Chaque jour à 22h00
0 8 * * 1-5Du lundi au vendredi à 8h00
*/15 * * * *Toutes les 15 minutes
0 0 1 * *Le 1er de chaque mois à minuit
30 9 * * 1Chaque lundi à 9h30
@rebootAu démarrage du système (alias spécial)
@dailyÉquivalent de 0 0 * * * — minuit chaque jour

Ajouter sa première tâche cron

# Dans ta VM Linux
crontab -e
# Sauvegarde chaque jour à 22h — capture la sortie ET les erreurs dans le log
0 22 * * * /bin/bash /home/marc/sauvegarde.sh >> /home/marc/sauvegarde.log 2>&1

Commandes cron essentielles

CommandeCe qu'elle fait
crontab -eÉditer ses tâches cron
crontab -lLister ses tâches actuelles (sans les modifier)
crontab -rSupprimer toutes ses tâches — irréversible, à utiliser avec précaution
systemctl status cronVérifier que le démon cron tourne (Ubuntu/Debian)
grep CRON /var/log/syslogVoir les exécutions passées et leurs éventuelles erreurs

Pour finir

Ton antisèche (les briques)

BriquePowerShellbash
AfficherWrite-Host "..."echo "..."
Variable$x = "val"x="val" (sans espaces)
DemanderRead-Host "?"read -p "?" x
Conditionif (...) { } else { }if [ ... ]; then ... fi
Plusieurs casswitch ($x) { 1 {} default {} }case $x in ... esac
Liste@("a","b") · $l[0] · $l += "c"l=(a b) · ${l[0]}
Boucle listeforeach ($f in $l) { }for f in *; do ... done
Boucle compteurfor ($i=1; $i -le 5; $i++) { }for i in {1..5}; do ... done
Fonctionfunction F { param($a) ... }f() { ... $1 ... }
Argument du scriptparam($a) · $args$1 $2 · $@
Commentaire##

Chiffres-repères et limites pratiques

GrandeurValeur repèrePourquoi ça compte
Taille raisonnable d'un script< 200-300 lignes par fichierAu-delà, découpe en fonctions ou en modules séparés (.psm1) — sinon impossible à maintenir
[int] PowerShell (int32)−2 147 483 648 → +2 147 483 647Dépasser = dépassement silencieux (overflow). Pour des tailles de fichiers en octets sur un grand disque, utilise [int64] ou [long]
Vitesse de copie locale (SSD → SSD)~500 Mo/s50 Go ≈ 1 min 40 s — planifie la nuit, pas pendant les heures de bureau
Vitesse de copie réseau (LAN 1 Gb)~100-115 Mo/s réels50 Go → 7-8 min ; au-delà de 30 min, réseau ou disque cible saturé
Get-Content sur un gros fichierCharge tout en RAMUn log de 500 Mo consomme 500 Mo de RAM d'un coup. Utilise Get-Content -ReadCount 1000 (par lots) pour les gros fichiers
Conservation des logs RGPDSouvent 90 jours en entrepriseAu-delà, les données de connexion nominatives doivent être supprimées (RGPD art. 5 — principe de minimisation)
Durée d'un script interactif avant que l'utilisateur croit que ça a planté< 30 secondes sans retour visibleAu-delà, ajoute un Write-Host "En cours..." de progression — sinon l'utilisateur ferme le terminal
Nombre de fichiers gérables par boucle foreachJusqu'à ~100 000 sans problème notablePour des millions de fichiers, passe au pipeline Get-ChildItem | ForEach-Object qui traite en flux et ne charge pas tout en mémoire

PowerShell, bash, ou Python — quand choisir quoi ?

CritèrePowerShellbashPython
OS naturelWindows (+ Linux/Mac avec PS 7)Linux / macOSTous (interpréteur à installer)
Administration système WindowsExcellent (AD, registre, services, IIS, Task Scheduler)DifficileVia bibliothèques (pywin32)
Administration système LinuxPossible mais non natifExcellent (processus, fichiers, réseau, cron)Bon via bibliothèques
Traitement CSV / donnéesBon (Import-Csv)Laborieux (awk, cut)Excellent (csv intégré, pandas, openpyxl)
API web / JSONBon (Invoke-RestMethod)Possible (curl + jq)Excellent (requests, json intégré)
Déploiement sans installationOui — PS 5.1 présent sur tout WindowsOui — bash présent sur tout Linux/macOSNon — Python à installer sur chaque machine
En BTS SIOScripts d'admin Windows, TP terminalScripts Linux dans la VMDéveloppement web (hors scope SLAM), analyse de données

Vérifie tes acquis

Exercice Réussi À revoir

  1. Qu'est-ce qu'un script, et dans quel ordre ses lignes s'exécutent-elles ?
  2. À quoi sert une variable ? Pourquoi faut-il parfois [int] sur une réponse de Read-Host ?
  3. Quand préfères-tu un switch à une suite de if/elseif ?
  4. Comment crée-t-on une liste, et à partir de quel index commence-t-elle ?
  5. Quelle est la différence entre une boucle for et une boucle foreach ? Et quand utiliser do…while ?
  6. À quoi sert param() en tête de script ? Comment lance-t-on alors le script ?
  7. Sous Linux, à quoi sert chmod +x avant de lancer un script ?
  8. En bash, quelle erreur produit nom = "GSB" (avec espaces) et pourquoi ?
  9. Quelle est la différence entre "..." et '...' en PowerShell ? Donne un exemple où les simples sont obligatoires.
  10. Que fait $ErrorActionPreference = "Stop" et pourquoi l'utiliser dans un script de sauvegarde automatique ?
Voir le corrigéMasquer le corrigé de l'exercice

Q1 — Un script est un fichier texte de commandes exécutées de haut en bas, dans l'ordre exact où elles sont écrites. Inverser deux lignes = inverser deux actions.
Q2 — Une variable mémorise une valeur pour la réutiliser. Read-Host renvoie toujours du texte : si tu veux comparer ou calculer un nombre, [int] le convertit (sinon "18" + 2 → "182" par collage).
Q3 — switch est préférable quand on compare une seule variable à plusieurs valeurs fixes (menu, extension, code). Pour des tests variés combinant plusieurs variables, reste sur if/elseif.
Q4 — $liste = @("a","b","c") ; l'index commence à 0. Dernier élément = [.Count - 1], ou [-1] directement.
Q5 — for compte (tu connais le nombre de tours à l'avance) ; foreach parcourt une collection (fichiers, liste). do…while s'utilise quand le bloc doit tourner au moins une fois (validation de saisie).
Q6 — param($a) déclare les arguments attendus. On lance : .\script.ps1 valeurA (positionnel) ou .\script.ps1 -a valeurA (nommé).
Q7 — chmod +x donne le bit « exécutable » au fichier. Sans lui : Permission denied. Linux distingue les droits lire/écrire/exécuter par fichier — une sécurité absente sous Windows.
Q8 — bash interprète nom comme une commande à lancer (avec = et "GSB" comme arguments). Message : nom : commande introuvable. Solution : coller les espaces (nom="GSB").
Q9 — "..." interprète les $variables ; '...' garde tout littéral. Obligatoire pour les mots de passe ou les regex contenant des $ qu'on ne veut pas substituer.
Q10 — Transforme toute erreur en exception attrapable par catch. Sans ça, un script de sauvegarde peut afficher une erreur rouge et continuer en « confirmant » une sauvegarde qui n'a pas eu lieu — le pire bug possible pour un outil de production.

Tu avais trouvé ?

Nuances métier — ce qu'on ne te dit pas toujours

SujetRéalité pro
Scripts en productionUn script qui tourne en tâche planifiée (Task Scheduler) n'a pas de terminal : tous les Write-Host disparaissent. Utilise Add-Content pour journaliser, et vérifie le code de retour (exit 0/1) — c'est le seul retour que tu as.
Droits d'exécutionUn script de nettoyage lancé en tant qu'utilisateur standard ne peut pas toucher C:\Windows\. En entreprise, les scripts d'administration tournent sous un compte de service dédié (principe du moindre privilège), jamais en admin permanent.
RGPD et logsUn log qui contient "Marc Dupont s'est connecté à 08:42" est une donnée personnelle au sens du RGPD. Conservation limitée (souvent 90 jours en entreprise), accès restreint, pas de log en texte clair sur un partage ouvert.
EncodageUn fichier CSV lu par un script PS et écrit dans un autre outil (Excel, Linux, web) doit être en UTF-8 sans BOM. L'encodage par défaut de PowerShell 5.1 (Windows) est UTF-16 ; PowerShell 7+ utilise UTF-8. Toujours préciser -Encoding UTF8.
Dette techniqueUn script de 300 lignes sans fonctions ni commentaires est impossible à maintenir. La règle de l'industrie : une fonction = une chose, max ~20-30 lignes, commentaire sur le pourquoi (pas le comment). Un collègue doit comprendre ton script dans 6 mois.
Sécurité des mots de passeNe jamais écrire un mot de passe en clair dans un script ($pass = "secret"). Si le script est dans un repo Git (même privé), le mot de passe peut fuiter. Utilise Read-Host -AsSecureString ou les variables d'environnement système configurées à part.

Glossaire

MotDéfinition
Scriptfichier texte contenant une suite de commandes exécutées dans l'ordre
Variableune boîte nommée qui contient une valeur réutilisable
Type (texte / nombre)nature d'une valeur : on calcule avec un nombre, on assemble du texte
if / elsecondition : faire une chose ou une autre selon un test vrai/faux
switchtester une variable contre plusieurs valeurs (menu, code, extension)
Liste (tableau)variable contenant plusieurs valeurs, accessibles par index (à partir de 0)
Boucle (foreach, for, while)répéter une action (sur chaque élément, en comptant, ou tant qu'une condition tient)
Fonctionbloc de code nommé et réutilisable, qui peut prendre des paramètres et renvoyer un résultat
Paramètre / argumentinfo donnée à une fonction ou à un script au moment de l'appel
Commentaire (#)ligne ignorée par la machine, note pour l'humain
Shebang (#!/bin/bash)1re ligne d'un script Linux qui indique l'interpréteur
chmod +xdonne à un fichier le droit d'être exécuté (Linux)

TP terminé ?

Coche chaque livrable quand tu l'as : c'est la preuve que l'étape est acquise.

livrables
–
quiz réussi
–
de série
–
Voir tous les TP