- Vue d’ensemble
- Notation des variables
- Step 1 : Portée et emplacement des variables
- Step 2 : CMD (%VAR%) — Consultation et configuration
- Step 3 : Vérifier les variables utilisateur et système dans CMD
- Step 4 : Sécurité lors de l’édition du PATH (CMD)
- Step 5 : PowerShell ($env:VAR) — Consultation et modification
- Step 6 : Voir les variables utilisateur / système avec précision
- Step 7 : Définition persistante via PowerShell (.NET API / Recommandé)
- Step 8 : Modification sûre du PATH (.NET API / Méthode recommandée)
- Step 9 : Suppression de variables
- Step 10 : Appliquer et vérifier
- Step 11 : Définir plusieurs variables en lot
- Résumé
Vue d’ensemble
Les variables d’environnement Windows sont lues à partir d’un bloc d’environnement généré lors du démarrage d’un processus. Cet article clarifie précisément la portée (Processus, Utilisateur, Système), le mécanisme de persistance, les méthodes de consultation et de configuration via CMD et PowerShell, ainsi que la différence d’affichage entre les variables utilisateur et système.
Notation des variables
| Nom | Exemple | Description |
|---|---|---|
<<VAR_NAME>> |
PATH |
Nom de la variable ciblée |
<<VALUE>> |
C:\Tools |
Valeur à définir |
Step 1 : Portée et emplacement des variables
| Type | Emplacement | Portée | Persistance | Remarque |
|---|---|---|---|---|
| Variables de processus | Mémoire | Processus actuel uniquement | Temporaire | CMD : set / PowerShell : $env: |
| Variables utilisateur | HKCU\Environment |
Utilisateur courant | Persistant | setx / .NET API |
| Variables système (Machine) | HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment |
Tous les utilisateurs | Persistant | setx /M / .NET API (admin) |
Processus, utilisateur et système sont distincts
- Processus : limité au shell actuel
- Utilisateur : propre à chaque profil
- Système : partagé par tous les utilisateurs
- PATH peut être affiché comme combinaison PATH Système + PATH Utilisateur
Step 2 : CMD (%VAR%) — Consultation et configuration
2-1. Lister les variables processus
set
2-2. Lire une variable
echo %<<VAR_NAME>>%
2-3. Définir une variable temporaire (session CMD uniquement)
set <<VAR_NAME>>=<<VALUE>>
2-4. Définir une variable persistante (setx)
Syntaxe de base
setx <<VAR_NAME>> "<<VALUE>>"
Portée utilisateur (par défaut)
setx <<VAR_NAME>> "<<VALUE>>"
Portée système (/M requis, administrateur)
setx <<VAR_NAME>> "<<VALUE>>" /M
Particularités de setx
- Ne met pas à jour la session CMD actuelle
- Les valeurs contenant
%PATH%sont développées puis figées- Le PATH peut être tronqué s’il est trop long (déconseillé)
Step 3 : Vérifier les variables utilisateur et système dans CMD
Utilisateur (HKCU)
reg query HKCU\Environment
Système (HKLM)
reg query "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment"
reg query montre toujours la valeur brute, non combinée.
Step 4 : Sécurité lors de l’édition du PATH (CMD)
Exemple dangereux :
# setx PATH "%PATH%;C:\Tools"
Risques :
%PATH%est développé et enregistré tel quel- REG_EXPAND_SZ → REG_SZ, perte possible de
%SystemRoot% - Tronquage fréquent sur les longues valeurs PATH
Éditer le PATH uniquement via PowerShell + .NET API.
Step 5 : PowerShell ($env:VAR) — Consultation et modification
5-1. Lister les variables de processus
Get-ChildItem Env:
5-2. Lire une variable
$env:<<VAR_NAME>>
5-3. Définir temporairement une variable
$env:<<VAR_NAME>> = "<<VALUE>>"
Step 6 : Voir les variables utilisateur / système avec précision
Utilisateur (HKCU)
Get-ItemProperty "HKCU:\Environment"
Système (HKLM)
Get-ItemProperty "HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager\Environment"
Step 7 : Définition persistante via PowerShell (.NET API / Recommandé)
Utilisateur (User)
[System.Environment]::SetEnvironmentVariable("<<VAR_NAME>>","<<VALUE>>","User")
Système (Machine, admin requis)
[System.Environment]::SetEnvironmentVariable("<<VAR_NAME>>","<<VALUE>>","Machine")
Avantages :
- Pas de tronquage du PATH
- Conservation du type REG_EXPAND_SZ
- Écriture fiable et sécurisée
Step 8 : Modification sûre du PATH (.NET API / Méthode recommandée)
$add = "C:\Tools"
$current = [System.Environment]::GetEnvironmentVariable("PATH","Machine")
$new = ($current.TrimEnd(';') + ';' + $add).Trim(';')
[System.Environment]::SetEnvironmentVariable("PATH",$new,"Machine")
Step 9 : Suppression de variables
9-1. Suppression dans le processus actuel
Remove-Item Env:<<VAR_NAME>> -ErrorAction SilentlyContinue
9-2. Suppression persistante (registre)
Utilisateur
Remove-ItemProperty -Path "HKCU:\Environment" -Name "<<VAR_NAME>>" -ErrorAction SilentlyContinue
Système (admin)
Remove-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" -Name "<<VAR_NAME>>" -ErrorAction SilentlyContinue
Step 10 : Appliquer et vérifier
10-1. Vérifier le processus actuel
Get-ChildItem Env:<<VAR_NAME>>
10-2. Vérifier côté CMD
echo %<<VAR_NAME>>%
10-3. Recharger immédiatement la valeur persistante
$env:<<VAR_NAME>> = [System.Environment]::GetEnvironmentVariable("<<VAR_NAME>>","User")
Step 11 : Définir plusieurs variables en lot
# Variables utilisateur
$vars = @{
"APPDATA_DIR" = "C:\AppData"
"LOG_PATH" = "C:\Logs"
"TOOLS" = "C:\Tools"
}
foreach ($v in $vars.GetEnumerator()) {
[System.Environment]::SetEnvironmentVariable($v.Key,$v.Value,"User")
}
# Variables système (admin)
$sysVars = @{
"JAVA_HOME" = "C:\Program Files\Java\<<VALUE>>"
}
foreach ($v in $sysVars.GetEnumerator()) {
[System.Environment]::SetEnvironmentVariable($v.Key,$v.Value,"Machine")
}
Résumé
- Les variables Processus / Utilisateur / Système sont indépendantes.
- CMD et PowerShell n’affichent pas toujours les mêmes portées.
- HKCU/HKLM permettent de voir les valeurs “réelles”.
- setx fonctionne mais n’est pas adapté au PATH.
- La méthode la plus sûre reste la .NET API (
SetEnvironmentVariable).
