W03 - PowerShell (et l’invite de commandes)

Objectif

Comprendre la logique objet de PowerShell, enchaîner des commandes avec le pipeline, écrire et exécuter un script .ps1.


1. cmd ou PowerShell ?

Invite de commandes (cmd)PowerShell
ÂgeHéritée de MS-DOSModerne (2006), multiplateforme depuis PowerShell 7
ManipuleDu texteDes objets (avec propriétés et méthodes)
Scripts.bat / .cmd.ps1
Exemplesdir, ipconfig, ping, copyGet-ChildItem, Get-Process, Get-Service

Les commandes classiques (ipconfig, ping, tracert, nslookup) marchent dans les deux. Terminal Windows (wt) regroupe cmd, PowerShell et WSL dans des onglets.

PowerShell 7 sous Linux (Arch : AUR powershell-bin ; Pop!_OS : paquet powershell du dépôt Microsoft) → pwsh.

2. La syntaxe Verbe-Nom

Toutes les commandes (cmdlets) s’écrivent Verbe-Nom : Get-Process, Stop-Service, New-Item, Set-Location.

VerbeSens
GetObtenir / afficher
SetModifier
NewCréer
RemoveSupprimer
Start / Stop / RestartDémarrer / arrêter / redémarrer
TestVérifier (ex. Test-Connection, Test-Path)
Get-Command *service*          # trouver les commandes qui parlent de "service"
Get-Help Get-Process -Examples # exemples d'utilisation
Update-Help                    # télécharger l'aide complète (admin)
Get-Alias ls                   # ls est un alias de Get-ChildItem

3. Les commandes du quotidien

BesoinPowerShellAlias / équivalent
ListerGet-ChildItemls, dir
Se déplacerSet-Location C:\Tempcd
Où suis-jeGet-Locationpwd
Lire un fichierGet-Content fichier.txt -Tail 20cat, type
Créer dossier / fichierNew-Item -ItemType Directory Projet / New-Item notes.txtmkdir
Copier / déplacer / supprimerCopy-Item, Move-Item, Remove-Item -Recursecp, mv, rm
Chercher du texteSelect-String -Path *.log -Pattern "erreur"(≈ grep)
ProcessusGet-Process, Stop-Process -Name notepadps, kill
ServicesGet-Service, Restart-Service Spooler
RéseauGet-NetIPAddress, Test-NetConnection srv -Port 443, Resolve-DnsName
Infos systèmeGet-ComputerInfosysteminfo

4. Le pipeline et les objets (exemple du cours)

flowchart LR
  A["Get-Process<br/>(tous les processus = objets)"] --> B["Sort-Object CPU -Descending<br/>(trier par CPU)"]
  B --> C["Select-Object -First 5 Id, ProcessName<br/>(garder 5 objets, 2 propriétés)"]
  C --> D["Format-Table<br/>(affichage)"]
Get-Process explorer                                   # un processus
Get-Process explorer | Format-List -Property *          # TOUTES ses propriétés
Get-Process | Sort-Object -Property CPU -Descending      # trier
Get-Process | Sort-Object -Property CPU -Descending | Select-Object -First 5 -Property Id, ProcessName
Get-Service | Where-Object Status -eq 'Stopped'          # filtrer
Get-ChildItem C:\Windows -File | Measure-Object -Property Length -Sum   # somme des tailles
Get-Process | Export-Csv processus.csv -NoTypeInformation -Encoding utf8  # exporter

Get-Member révèle ce que contient un objet : Get-Process | Get-Member. C'est LA commande pour découvrir quelles propriétés filtrer ou trier.

5. Variables, conditions, boucles

$nom = "Hugo"                          # variable
$liste = @("Compta", "RH", "Direction") # tableau
$age = 20
if ($age -ge 18) { "Majeur" } else { "Mineur" }
foreach ($service in $liste) { Write-Host "Service : $service" }
1..5 | ForEach-Object { "Tour $_" }     # $_ = élément courant du pipeline
OpérateurSens
-eq / -neégal / différent
-gt / -ge / -lt / -le> / ≥ / < / ≤
-like "*.log"correspond au motif
-match "^SRV"expression régulière
-and / -or / -notET / OU / NON

6. Écrire et lancer un script

notepad top5.ps1      # ou VS Code
# top5.ps1 — les 5 processus les plus gourmands en CPU
Get-Process |
  Sort-Object -Property CPU -Descending |
  Select-Object -First 5 -Property Id, ProcessName, CPU
.\top5.ps1

Si refusé (l’exécution de scripts est désactivée) :

Get-ExecutionPolicy -List
Set-ExecutionPolicy -Scope CurrentUser RemoteSigned   # scripts locaux autorisés, ceux d'Internet doivent être signés
Unblock-File .\script-telecharge.ps1                  # débloquer un script téléchargé dont tu as vérifié le contenu

Set-ExecutionPolicy Unrestricted ou Bypass partout = mauvaise pratique. RemoteSigned sur ton utilisateur suffit.

7. Scripts fournis

scripts/windows/analyser_dossier.ps1 (exercice du cours, enrichi)

param([Parameter(Mandatory = $true)][string]$Chemin, [int]$Top = 20)
if (-not (Test-Path -Path $Chemin)) { Write-Error "Le chemin '$Chemin' n'existe pas."; exit 1 }
function Obtenir-Taille($element) {
    if ($element.PSIsContainer) {
        $somme = (Get-ChildItem -Path $element.FullName -Recurse -File -ErrorAction SilentlyContinue |
                  Measure-Object -Property Length -Sum).Sum
        if ($null -eq $somme) { return 0 } else { return $somme }
    }
    return $element.Length
}
$resultats = Get-ChildItem -Path $Chemin -Force -ErrorAction SilentlyContinue | ForEach-Object {
    [PSCustomObject]@{
        Nom = $_.Name
        Type = if ($_.PSIsContainer) { "Dossier" } else { "Fichier" }
        'Taille Mo' = [math]::Round((Obtenir-Taille $_) / 1MB, 2)
        Modifie = $_.LastWriteTime
    }
}
$resultats | Sort-Object 'Taille Mo' -Descending | Select-Object -First $Top | Format-Table -AutoSize

Usage : .\analyser_dossier.ps1 -Chemin "C:\Users\Public" -Top 10

scripts/windows/infos_systeme.ps1

Fiche d’identité du poste (OS, CPU, RAM, disques, IP/DNS/passerelle, processus gourmands, services automatiques arrêtés). Usage : .\infos_systeme.ps1 | Out-File -Encoding utf8 rapport.txt.

8. Exercice proposé (comme en cours)

Écrire un script qui : demande un nom de service, vérifie qu’il existe, affiche son état, et le redémarre s’il est arrêté.

Voir aussi