Aller au contenu principal

Mon premier script PowerShell

Notions théoriques

PowerShell n'est pas l'invite de commandes

Vous connaissez peut-être cmd.exe, l'ancienne invite de commandes de Windows. PowerShell est différent : c'est à la fois un shell (pour taper des commandes interactivement) et un véritable langage de script, bâti sur .NET, capable de manipuler de vraies variables, conditions, boucles et fonctions.

Il existe deux versions à connaître :

  • Windows PowerShell 5.1 (powershell.exe), livrée avec Windows depuis Windows 7 — vous la trouverez sur quasiment tous les postes et serveurs d'entreprise.
  • PowerShell 7 (pwsh.exe), la version moderne, multiplateforme (Windows, Linux, macOS), à installer séparément.

Les séances de ce cours fonctionnent avec les deux versions.

Où écrire ses scripts

Pour tester rapidement une commande, la console PowerShell suffit. Pour écrire un vrai script, VS Code avec l'extension PowerShell est l'outil recommandé (coloration syntaxique, complétion, débogueur). Vous croiserez aussi l'ISE (Integrated Scripting Environment), présente sur tous les postes Windows et pratique en salle de TP.

info

L'ISE n'est plus développée par Microsoft et ne gère que PowerShell 5.1. Elle reste utile en dépannage rapide, mais VS Code est l'outil à privilégier pour un usage régulier.

Les cmdlets et la convention Verbe-Nom

Les commandes PowerShell s'appellent des cmdlets (prononcer « command-lets »). Elles suivent toutes la même convention de nommage : Verbe-Nom, avec le nom toujours au singulier.

Get-Process # lire la liste des processus
Set-Service # modifier un service
New-Item # créer un fichier ou un dossier
Remove-Item # supprimer un fichier ou un dossier
Stop-Process # arrêter un processus

Get-Verb liste tous les verbes approuvés par Microsoft. Cette régularité rend PowerShell devinable : une fois la convention connue, on peut souvent deviner le nom d'une cmdlet sans l'avoir jamais vue — contrairement aux commandes Linux, où chaque nom (ls, cp, grep, chmod...) est à apprendre séparément.

Découvrir sans documentation externe

PowerShell est auto-documenté :

Get-Command -Noun Service # toutes les cmdlets qui agissent sur les services
Get-Command *disk* # toutes les cmdlets dont le nom contient "disk"
Get-Help Get-Service -Examples # des exemples d'utilisation
Get-Help Get-Service -Full # l'aide complète
astuce

La première fois, lancez Update-Help dans une console ouverte en administrateur : cela télécharge les fichiers d'aide complets, plus détaillés que l'aide minimale installée par défaut.

Les alias

Certaines cmdlets ont des alias plus courts : ls, dir et gci pointent tous vers Get-ChildItem ; cat vers Get-Content ; ps vers Get-Process. La commande Get-Alias les liste tous.

attention

Les alias sont pratiques en interactif, mais à bannir dans un script. Get-ChildItem est lisible par n'importe qui ; gci ou dir obligent à deviner, et certains alias n'existent pas sur toutes les plateformes (Windows/Linux/macOS).

L'extension .ps1 et l'en-tête du script

Un script PowerShell porte l'extension .ps1. Contrairement à Bash, il n'y a pas de shebang : c'est l'extension du fichier, pas sa première ligne, qui indique à Windows comment l'exécuter. Il reste vivement conseillé de commencer chaque script par un en-tête commenté :

<#
Script : Get-InfosSysteme.ps1
Rôle : afficher un rapport système
Auteur : Votre nom
#>

Le # commente une seule ligne ; le bloc <# ... #> commente plusieurs lignes.

La politique d'exécution

Par défaut, sur un poste Windows client, la politique d'exécution est Restricted : aucun script ne peut démarrer, même le vôtre.

Get-ExecutionPolicy
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
ValeurEffet
RestrictedAucun script ne s'exécute (valeur par défaut sur un poste client)
AllSignedSeuls les scripts signés numériquement s'exécutent
RemoteSignedLes scripts locaux s'exécutent librement, ceux téléchargés doivent être signés
UnrestrictedTous les scripts s'exécutent, avec un simple avertissement
BypassTous les scripts s'exécutent, sans aucun avertissement

Le paramètre -Scope CurrentUser applique le changement uniquement à votre session, sans nécessiter les droits administrateur.

attention

La politique d'exécution n'est pas une barrière de sécurité : c'est un garde-fou contre l'exécution accidentelle d'un script. Ne laissez jamais un poste en Unrestricted ou Bypass de façon permanente.

Exécuter un script

.\Get-InfosSysteme.ps1

Comme en Bash, le .\ est obligatoire : le répertoire courant ne fait pas partie du PATH, pour éviter qu'un exécutable malveillant placé dans un dossier ne soit lancé par erreur.

MessageCause probable
... n'est pas reconnu comme nom d'applet de commande...Oubli du .\ devant le nom du script
... l'exécution de scripts est désactivée sur ce système...Politique d'exécution trop restrictive → Set-ExecutionPolicy
Chemin avec un espaceEntourer le chemin de guillemets : & "C:\Mes Scripts\a.ps1"

Afficher un message

Write-Host "Bonjour" -ForegroundColor Green

Write-Host affiche du texte à l'écran, pour l'utilisateur. Il existe une autre cmdlet, Write-Output, qui envoie une valeur dans le pipeline plutôt qu'à l'écran — la différence sera détaillée dans la séance sur le pipeline.

Et en Bash ?
BashPowerShell
Shebang #!/bin/bashExtension .ps1 (pas de shebang)
chmod +x script.shSet-ExecutionPolicy -Scope CurrentUser RemoteSigned
./script.sh.\script.ps1
echo "texte"Write-Host "texte"

Exemple pratique

<#
Script : Get-InfosSysteme.ps1
Rôle : afficher un petit rapport sur le poste Windows
Auteur : Votre nom
#>

Write-Host "=== Rapport système ===" -ForegroundColor Cyan
Write-Host "Date actuelle : $(Get-Date)"
Write-Host "Nom de machine : $env:COMPUTERNAME"
Write-Host "Utilisateur : $env:USERNAME"
Write-Host "Version PS : $($PSVersionTable.PSVersion)"
Write-Host "=== Fin du rapport ===" -ForegroundColor Cyan

Pour l'utiliser, dans une console PowerShell :

Get-ExecutionPolicy
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
.\Get-InfosSysteme.ps1
astuce

$env:COMPUTERNAME et $env:USERNAME sont des variables d'environnement, disponibles partout sans configuration. Nous les détaillerons dans la prochaine séance.

Test de mémorisation/compréhension


Quelle commande affiche la politique d'exécution actuelle ?


Le message « l'exécution de scripts est désactivée sur ce système » signifie que...


Pourquoi écrire .\script.ps1 et non simplement script.ps1 ?


Toutes les cmdlets PowerShell suivent la convention...


Quelle commande retrouve toutes les cmdlets qui agissent sur les services ?


TP pour réfléchir et résoudre des problèmes

Nous allons créer le premier script de notre boîte à outils d'administration Windows : Get-InfosSysteme.ps1. Il sera repris et enrichi au fil des prochaines séances.

Étape 1 — Autoriser l'exécution de scripts


Bonne pratique - Le scope le plus étroit possible

Préférez toujours -Scope CurrentUser à une modification globale de la machine : vous n'avez besoin de droits administrateur que pour vous-même, pas pour tous les utilisateurs du poste.

Étape 2 — Écrire l'en-tête et le titre du rapport


Bonne pratique - Documenter le rôle du script

Commencez toujours vos scripts par un bloc <# ... #> expliquant leur rôle et leur auteur. Un script sans en-tête est difficile à comprendre pour quelqu'un d'autre, ou pour vous-même quelques mois plus tard.

Étape 3 — Afficher la date et le nom de la machine, puis lancer le script


Bonne pratique - Tester après chaque ajout

Lancez .\Get-InfosSysteme.ps1 après chaque ligne ajoutée, plutôt que d'écrire tout le script d'un coup. Une erreur est bien plus facile à localiser quand une seule ligne vient de changer.

📌 Une solution