Commandes pour afficher et configurer les variables d’environnement Windows

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).