Aller au contenu
Réussir mon BTS SIO

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

Par exemple

Chapitre 213 minDébutant

PowerShell 7 et Windows PowerShell 5.1 : versions et différences

Par Josselyn C., prof de BTS SIO. Mis à jour le .

À la fin de ce chapitre, tu sauras

  • distinguer Windows PowerShell 5.1 et PowerShell 7, et savoir lequel tu utilises ;
  • installer PowerShell 7 sous Windows et sous Debian ;
  • lancer un script en ligne de commande avec les bonnes options ;
  • écrire un script qui fonctionne dans les deux versions.

3 exercices corrigés

Deux PowerShell cohabitent sous Windows : Windows PowerShell 5.1, intégré au système et figé, et PowerShell 7, la version moderne et multiplateforme qu'il faut installer. Ce chapitre explique leurs différences, comment installer PowerShell 7 sous Windows et sous Debian, comment écrire un script qui fonctionne avec les deux, et comment lancer un script en ligne de commande avec les bonnes options.

Deux produits, deux cycles de vie

Windows PowerShell 5.1PowerShell 7
Exécutablepowershell.exepwsh.exe sous Windows, pwsh sous Linux et macOS
Moteur.NET Framework 4.x.NET moderne (.NET 10 pour PowerShell 7.6)
SystèmesWindows uniquementWindows, Linux, macOS
InstallationLivré avec Windows 10, Windows 11 et Windows Server 2016 à 2025À installer, à côté de 5.1 sans la remplacer
ÉvolutionPlus aucune nouveauté, seulement des correctifs de sécuritéUne version LTS tous les deux ans, au rythme de .NET
Édition ($PSVersionTable.PSEdition)DesktopCore
Encodage par défaut des fichiers écritsVariable selon la commande (UTF-16 pour >, ANSI pour Set-Content, ASCII pour Export-Csv)UTF-8 sans BOM partout

Windows PowerShell 5.1 est un composant de Windows : il est supporté aussi longtemps que la version de Windows qui le porte. PowerShell 7 suit le cycle de .NET. Début novembre 2026, voici les versions en circulation :

VersionSortieFin du support.NET
PowerShell 7.6 (LTS)18 mars 202614 novembre 2028.NET 10
PowerShell 7.523 janvier 202510 novembre 2026.NET 9
PowerShell 7.4 (LTS)16 novembre 202310 novembre 2026.NET 8

PowerShell 7.4 et 7.5 cessent d'être maintenues le 10 novembre 2026 : sur un serveur, installe 7.6, et mets-la à jour, car Microsoft ne supporte que le dernier correctif d'une version.

Savoir quelle version tu utilises

powershell
$PSVersionTable
text
Name                           Value
----                           -----
PSVersion                      7.6.9
PSEdition                      Core
GitCommitId                    7.6.9
OS                             Microsoft Windows 10.0.26100
Platform                       Win32NT
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0…}
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1
WSManStackVersion              3.0

La version exacte dépend du dernier correctif installé. Dans Windows PowerShell 5.1, PSVersion commence par 5.1 et PSEdition vaut Desktop. Pour un test dans un script, $PSVersionTable.PSVersion.Major donne le numéro principal (5 ou 7).

Le titre de la fenêtre aide aussi : « Windows PowerShell » pour 5.1, « PowerShell 7 » (ou pwsh) pour la version moderne. Dans le Terminal Windows, installé par défaut sur Windows 11 et Windows Server 2025, chaque version a son profil dans le menu déroulant des onglets.

Installer PowerShell 7

Sous Windows, le plus simple est le gestionnaire de paquets winget, présent sur Windows 11 et Windows Server 2025 :

powershell
winget install --id Microsoft.PowerShell --source winget

Microsoft fournit aussi un paquet MSI, pratique pour un déploiement par GPO ou par l'outil de gestion de parc. PowerShell 7 s'installe dans C:\Program Files\PowerShell\7\ et se met à jour comme le reste du système par Microsoft Update si tu as coché l'option à l'installation.

Sous Debian 13, PowerShell vient du dépôt de Microsoft, que l'on ajoute avec le paquet de configuration prévu pour la version de Debian :

bash
sudo apt-get update
sudo apt-get install -y wget
source /etc/os-release
wget -q "https://packages.microsoft.com/config/debian/$VERSION_ID/packages-microsoft-prod.deb"
sudo dpkg -i packages-microsoft-prod.deb
rm packages-microsoft-prod.deb
sudo apt-get update
sudo apt-get install -y powershell
pwsh

/etc/os-release définit la variable VERSION_ID (13 sur Debian 13), ce qui construit l'adresse du bon paquet. Le même principe vaut pour Ubuntu 24.04 avec l'adresse config/ubuntu/24.04/.

Ce que PowerShell 7 ajoute au langage

La syntaxe de base est la même dans les deux versions. PowerShell 7 ajoute des opérateurs et des paramètres qui simplifient les scripts, mais qui provoquent une erreur de syntaxe dans 5.1.

Nouveauté de PowerShell 7ExempleÉquivalent en 5.1
Chaînage && et ||ping -n 1 srv-ad && Write-Output "joignable"if ($?) { … } après la commande
Opérateur ternaire ? :$etat = $libre -lt 10 ? 'ALERTE' : 'OK'if ($libre -lt 10) { 'ALERTE' } else { 'OK' }
Opérateur ?? (valeur par défaut si $null)$serveur = $Serveur ?? 'srv-ad'if ($null -eq $Serveur) { … }
Boucle parallèle$serveurs | ForEach-Object -Parallel { Test-Connection $_ -Count 1 }Start-Job, Invoke-Command vers plusieurs machines
Détail d'une erreurGet-Error$Error[0] | Format-List * -Force
Ignorer un certificat de testInvoke-RestMethod -SkipCertificateCheck …Bricolage de la classe ServicePointManager
JSON vers table de hachageConvertFrom-Json -AsHashtableNon disponible
Valider un JSONTest-JsonNon disponible
Encodage ansi et utf8BOM explicitesExport-Csv -Encoding utf8BOM-Encoding UTF8 (toujours avec BOM)

Les modules Windows dans PowerShell 7

Un module est un paquet de commandes : ActiveDirectory, DnsServer, DhcpServer, GroupPolicy, SmbShare. Sous Windows Server 2019 et suivants, et avec les outils RSAT de Windows 10 et 11, la plupart des modules d'administration se chargent directement dans PowerShell 7, ActiveDirectory compris. Pour les rares modules qui exigent encore le .NET Framework, PowerShell 7 dispose d'une couche de compatibilité : il démarre en coulisse une session Windows PowerShell 5.1 et y exécute les commandes.

powershell
Get-Module -ListAvailable ActiveDirectory          # le module est-il installé ?
Import-Module ActiveDirectory                      # chargement natif dans PowerShell 7
Import-Module NomDuModule -UseWindowsPowerShell    # chargement forcé par la couche de compatibilité

Les objets renvoyés par la couche de compatibilité sont des copies sérialisées : leurs propriétés sont là, leurs méthodes non. Quelques modules sont même refusés par cette couche, comme UpdateServices, celui de WSUS : ceux-là s'utilisent dans powershell.exe. Pour un script d'administration de serveur Windows, la règle simple est donc : si un module pose problème dans pwsh, lance le script dans Windows PowerShell 5.1.

Lancer un script en ligne de commande

Une tâche planifiée, un raccourci ou un autre programme lance un script avec l'exécutable et des options :

text
pwsh.exe -NoProfile -NonInteractive -File "C:\Scripts\Get-ServicesArretes.ps1" -Serveur srv-ad
powershell.exe -NoProfile -NonInteractive -File "C:\Scripts\Get-ServicesArretes.ps1" -Serveur srv-ad
OptionRôle
-File cheminExécute un script ; ce qui suit est passé au script comme paramètres
-Command "…"Exécute une commande ou un bloc de code donné en texte
-NoProfileNe charge pas le profil de l'utilisateur : le script se comporte pareil quel que soit le compte
-NonInteractiveInterdit toute question : un Read-Host provoque une erreur au lieu d'attendre indéfiniment
-ExecutionPolicy RemoteSignedFixe la stratégie d'exécution pour ce lancement seulement (chapitre 15)

Le code de sortie d'un script lancé avec -File est celui de son instruction exit : exit 0 si tout va bien, exit 1 (ou un autre nombre) en cas d'échec. Une tâche planifiée, un outil de supervision ou un script Bash qui appelle pwsh lisent ce code pour savoir si le script a réussi.

Le profil PowerShell

Le profil est un script exécuté à l'ouverture de chaque session interactive : on y met des alias, des fonctions personnelles, l'apparence de l'invite. Son chemin est dans $PROFILE, et il n'est pas le même pour 5.1 (Documents\WindowsPowerShell\) et pour 7 (Documents\PowerShell\).

powershell
$PROFILE                                   # le chemin du profil de la session
Test-Path $PROFILE                         # existe-t-il ?
New-Item -Path $PROFILE -ItemType File -Force
code $PROFILE                              # l'ouvrir dans VS Code

Un script d'administration ne doit jamais dépendre du profil : il tournera un jour sous un autre compte, ou dans une tâche planifiée lancée avec -NoProfile. Tout ce dont il a besoin se trouve dans le script lui-même.

Écrire un script compatible avec les deux versions

Pour qu'un script tourne partout :

  • évite &&, ||, ? : et ??, ou déclare #Requires -Version 7.4 en tête si tu en as besoin ;
  • précise toujours l'encodage des fichiers écrits (-Encoding UTF8 fonctionne dans les deux, avec ou sans BOM selon la version) ;
  • enregistre le fichier .ps1 en UTF-8 avec BOM s'il contient des accents ;
  • teste-le dans powershell.exe et dans pwsh.exe avant de le déployer.
powershell
#Requires -Version 5.1
# Fonctionne dans Windows PowerShell 5.1 et dans PowerShell 7
if ($PSVersionTable.PSVersion.Major -ge 7) {
    Write-Output "PowerShell $($PSVersionTable.PSVersion) : fonctions modernes disponibles"
} else {
    Write-Output "Windows PowerShell $($PSVersionTable.PSVersion) : mode compatible"
}

Exercices

Exercice 1 sur 3 Quelle version ? Réussi À revoir

Sur trois machines, $PSVersionTable.PSVersion et $PSVersionTable.PSEdition affichent :

MachinePSVersionPSEdition
srv-ad5.1.26100.1Desktop
Poste d'administration7.6.9Core
srv-gestion7.4.6Core
  1. Quel exécutable as-tu ouvert sur chaque machine ?
  2. Laquelle demande une action rapide, et laquelle ?
  3. Un script commence par #Requires -Version 7.4. Sur quelles machines s'exécute-t-il, dans la session indiquée ?
Voir la réponseMasquer la réponse de l'exercice 1
  1. powershell.exe (Windows PowerShell 5.1) sur srv-ad ; pwsh.exe (PowerShell 7) sur les deux autres.
  2. srv-gestion : PowerShell 7.4 n'est plus maintenu après le 10 novembre 2026, et 7.4.6 n'est de toute façon pas le dernier correctif de la 7.4. Il faut passer à la 7.6 LTS. Windows PowerShell 5.1 sur srv-ad n'est pas un problème : il est maintenu avec Windows Server.
  3. Sur le poste d'administration et sur srv-gestion (7.4.6 est supérieur ou égal à 7.4). Sur srv-ad, dans la session 5.1, le script refuse de démarrer, avec un message qui indique la version requise. Si PowerShell 7 est installé sur srv-ad, il suffit de lancer le script avec pwsh.exe.

Tu avais trouvé ?

Exercice 2 sur 3 Rendre un script compatible Réussi À revoir

Ce script fonctionne sur le poste d'administration, mais affiche une erreur de syntaxe sur srv-ad, où seul Windows PowerShell 5.1 est installé. Réécris-le pour qu'il fonctionne dans les deux versions.

powershell
$libreGo = [math]::Round((Get-PSDrive C).Free / 1GB)
$etat = $libreGo -lt 10 ? 'ALERTE' : 'OK'
Test-Path 'D:\Partages' && Write-Output 'Partages présents'
Write-Output "$env:COMPUTERNAME : $libreGo Go libres, $etat"
Voir la réponseMasquer la réponse de l'exercice 2
powershell
$libreGo = [math]::Round((Get-PSDrive C).Free / 1GB)
if ($libreGo -lt 10) { $etat = 'ALERTE' } else { $etat = 'OK' }
if (Test-Path 'D:\Partages') { Write-Output 'Partages présents' }
Write-Output "$env:COMPUTERNAME : $libreGo Go libres, $etat"

L'opérateur ternaire ? : et le chaînage && n'existent qu'à partir de PowerShell 7.0. Le if fonctionne partout. Le fichier contient « présents » : enregistre-le en UTF-8 avec BOM pour que Windows PowerShell 5.1 affiche correctement l'accent.

Tu avais trouvé ?

Exercice 3 sur 3 La bonne ligne de commande Réussi À revoir

Une tâche planifiée doit lancer chaque nuit C:\Scripts\Export-Annuaire.ps1 avec PowerShell 7, en lui passant le paramètre -Dossier D:\Exports. Le script ne doit pas charger de profil et ne doit jamais attendre une saisie. Écris la ligne de commande complète, puis explique ce qui se passe si le script contient un Read-Host oublié.

Voir la réponseMasquer la réponse de l'exercice 3
text
"C:\Program Files\PowerShell\7\pwsh.exe" -NoProfile -NonInteractive -File "C:\Scripts\Export-Annuaire.ps1" -Dossier "D:\Exports"

Avec -NonInteractive, le Read-Host provoque une erreur (« PowerShell is in NonInteractive mode ») au lieu d'attendre : le script ne reste pas suspendu, et l'erreur apparaît dans son journal. Si le script applique la gestion d'erreurs du chapitre 7 ($ErrorActionPreference = 'Stop'), il s'arrête net et la tâche se termine avec un code de sortie 1, visible dans son historique. Sans -NonInteractive, la tâche resterait « en cours d'exécution » indéfiniment, à attendre une réponse que personne ne tapera, et la nuit suivante elle ne se relancerait pas, puisqu'une instance tourne encore.

Tu avais trouvé ?

Chapitre terminé !

Fais les 3 exercices avant de passer à la suite : c'est en t'entraînant que tout se fixe.

chapitres
–
de série
–
du cours
–
Chapitre suivant : Cmdlets, objets et pipeline PowerShellRevoir le sommaire du cours