Aller au contenu principal

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 :

BashPowerShell
Affectationnom="Alice"aucun espace toléré autour du =$nom = "Alice" — les espaces sont autorisés et recommandés
nom = "Alice"Erreur : nom: command not foundParfaitement valide
Lecture$nom$nom
info

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
attention

É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
info

+= 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.

Et en Bash ?
BashPowerShell
nom="Alice" (pas d'espace)$nom = "Alice" (espaces autorisés)
$nom$nom
"$nom" interprète, '$nom' nonIdentique
$(( 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"
astuce

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


Quelles affectations sont valides en PowerShell ?


Que retourne l'expression "5" + 5 en PowerShell ?


Comment afficher la propriété Name de $service dans une chaîne de caractères ?


Que contient la variable $env:COMPUTERNAME ?


Comment connaître le nombre d'éléments du tableau $serveurs ?


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

Étape 1 — Déclarer les constantes du script


Bonne pratique - Regrouper ses constantes en haut 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


Bonne pratique - Préférer une variable d'environnement à une valeur en dur

$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é


Bonne pratique - Un format de date qui se trie tout seul

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.

📌 Une solution