Les variables en PowerShell
Notions théoriques
Déclarer une variable
$nom = "Alice"
En PowerShell, le $ fait partie du nom de la variable, aussi bien à l'écriture qu'à la lecture : on écrit $nom = "Alice" puis on relit avec $nom.
Attention aux espaces autour du =
C'est un point qui surprend souvent celles et ceux qui viennent de faire du Bash :
| Bash | PowerShell | |
|---|---|---|
| Affectation | nom="Alice" — aucun espace toléré autour du = | $nom = "Alice" — les espaces sont autorisés et recommandés |
nom = "Alice" | Erreur : nom: command not found | Parfaitement valide |
| Lecture | $nom | $nom |
PowerShell est donc plus permissif que Bash sur ce point précis, et la convention de la communauté est d'espacer le = pour la lisibilité. En revanche, PowerShell est plus strict ailleurs : les parenthèses et les accolades d'un if sont obligatoires, comme nous le verrons dans une prochaine séance.
Les guillemets
Comme en Bash, "..." interprète les variables et '...' prend le texte au pied de la lettre :
$nom = "Alice"
Write-Host "Bonjour $nom" # affiche : Bonjour Alice
Write-Host 'Bonjour $nom' # affiche : Bonjour $nom
Écrire "$disque.Size" n'affiche pas la propriété Size de l'objet $disque : PowerShell affiche l'objet suivi du texte littéral .Size. Pour insérer le résultat d'une expression complexe dans une chaîne, il faut la sous-expression $( ) :
Write-Host "Taille : $($disque.Size)"
C'est l'erreur n°1 des débutants en PowerShell.
Tout est un objet typé
$x = 5
$x.GetType().Name # Int32
"abc".GetType().Name # String
Le typage est dynamique par défaut, mais on peut contraindre le type d'une variable :
[int]$age = 20
[string]$nom = "Alice"
[datetime]$dateEmbauche = "2024-01-15"
[bool]$actif = $true
Ce typage a des conséquences concrètes. Observez :
"5" + 5 # résultat : 55 (le "5" texte force une concaténation de chaînes)
5 + "5" # résultat : 10 (le 5 nombre force une addition, "5" est converti)
C'est le type du membre de gauche qui décide de l'opération.
Les calculs sont natifs
Contrairement à Bash, qui a besoin de $(( )) ou de expr, PowerShell calcule directement :
$total = $a * 3 + 1
$compteur = 0
$compteur += 1
$compteur++
$null
$null représente une variable non définie ou volontairement vidée. La bonne pratique est d'écrire $null à gauche de la comparaison :
if ($null -eq $x) { ... }
La raison exacte sera détaillée dans la séance sur les conditions.
Les variables automatiques et d'environnement
PowerShell fournit des variables prêtes à l'emploi :
$env:COMPUTERNAME # nom de la machine
$env:USERNAME # utilisateur connecté
$env:TEMP # dossier temporaire
$env:PATH # liste des dossiers de recherche des exécutables
$PSVersionTable # informations sur la version de PowerShell
$PWD # dossier de travail actuel
Get-ChildItem Env: liste toutes les variables d'environnement disponibles. Voir aussi le cours Variables d'environnement.
Les tableaux
$serveurs = @("SRV-DC1", "SRV-FILE1")
$serveurs = "SRV-DC1", "SRV-FILE1" # équivalent, sans @()
$vide = @()
$serveurs[0] # premier élément : SRV-DC1
$serveurs[-1] # dernier élément : SRV-FILE1
$serveurs.Count # nombre d'éléments : 2
$serveurs += "SRV-WEB1" # ajout d'un élément
+= reconstruit entièrement le tableau à chaque appel. C'est parfaitement acceptable pour quelques éléments comme ici, mais coûteux sur des milliers d'éléments — un point que nous approfondirons au niveau 2.
Constantes et conventions de nommage
Regroupez vos constantes en haut du script, en PascalCase pour les variables importantes, avec des noms explicites plutôt que des abréviations.
| Bash | PowerShell |
|---|---|
nom="Alice" (pas d'espace) | $nom = "Alice" (espaces autorisés) |
$nom | $nom |
"$nom" interprète, '$nom' non | Identique |
$(( a + b )) | $a + $b directement |
$USER, $HOME | $env:USERNAME, $env:USERPROFILE |
Exemple pratique
<#
Script : Get-InfosSysteme.ps1
Rôle : rapport système avec un nom de fichier daté (v1)
#>
# --- Constantes ---
$DossierRapports = "C:\Rapports"
$PrefixeFichier = "inventaire"
# --- Variables calculées ---
$Ordinateur = $env:COMPUTERNAME
$DateJour = Get-Date -Format "yyyy-MM-dd"
$Utilisateur = $env:USERNAME
# --- Construction du nom de fichier ---
$NomFichier = "$PrefixeFichier-$Ordinateur-$DateJour.txt"
$CheminComplet = Join-Path -Path $DossierRapports -ChildPath $NomFichier
Write-Host "Rapport pour $Ordinateur généré par $Utilisateur"
Write-Host "Fichier cible : $CheminComplet"
Join-Path construit un chemin de fichier correctement, sans avoir à se soucier d'un éventuel antislash final manquant ou en trop dans $DossierRapports.
Test de mémorisation/compréhension
TP pour réfléchir et résoudre des problèmes
Étape 1 — Déclarer les constantes du script
Placer toutes les constantes au début du fichier permet de tout modifier au même endroit, sans avoir à parcourir tout le script.
Étape 2 — Récupérer le nom de la machine et la date formatée
$env:COMPUTERNAME s'adapte automatiquement à la machine sur laquelle le script s'exécute, contrairement à un nom de machine écrit en dur qui ne fonctionnerait que sur un seul poste.
Étape 3 — Construire le nom de fichier daté
Le format yyyy-MM-dd a l'avantage de faire coïncider le tri alphabétique et le tri chronologique : une liste de fichiers ainsi nommés apparaît naturellement dans l'ordre des dates.