Windows-Umgebungsvariablen: Anzeigen, Setzen und Persistieren per CMD und PowerShell

Übersicht

Umgebungsvariablen unter Windows basieren auf Environment-Blöcken, die beim Start eines Prozesses erzeugt werden. Dieser Artikel erklärt präzise, wie Prozess-, Benutzer- und Systemvariablen aufgebaut sind, wie sie sich unterscheiden, wie sie sichtbar werden und wie sie per CMD und PowerShell korrekt gesetzt und dauerhaft gespeichert werden.


Variablennotation

Variable Beispiel Beschreibung
<<VAR_NAME>> PATH Zielvariable
<<VALUE>> C:\Tools Zu setzender Wert

Step 1: Geltungsbereiche und Speicherorte

Typ Speicherort Gültigkeit Persistenz Hinweis
Prozessvariablen Speicher (RAM) Aktueller Prozess Temporär CMD: set / PowerShell: $env:
Benutzervariablen HKCU\Environment Aktueller Benutzer Dauerhaft setx / .NET API
Systemvariablen HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment Alle Benutzer Dauerhaft setx /M / .NET API (Admin)

Prozess vs. Benutzer vs. System

  • Prozess: nur für die laufende Shell
  • Benutzer: benutzerspezifisch
  • System: global für alle
  • PATH wird oft aus System-PATH + Benutzer-PATH zusammengeführt angezeigt

Step 2: CMD (%VAR%) – Anzeigen und Setzen

2-1. Prozessvariablen anzeigen

set

2-2. Variable anzeigen

echo %<<VAR_NAME>>%

2-3. Temporär setzen (nur aktuelles CMD)

set <<VAR_NAME>>=<<VALUE>>

2-4. Dauerhaft setzen (setx)

Benutzervariablen

setx <<VAR_NAME>> "<<VALUE>>"

Systemvariablen (Admin, /M Pflicht)

setx <<VAR_NAME>> "<<VALUE>>" /M

Hinweise zu setx:

  • Gilt nicht für die aktuelle CMD-Sitzung
  • %PATH% wird expandiert und fix gespeichert
  • Längenbegrenzungen → mögliche Abschneidungen

Step 3: Benutzer- und Systemvariablen per CMD präzise anzeigen

Benutzervariablen

reg query HKCU\Environment

Systemvariablen

reg query "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment"

Dies zeigt immer die rohen, nicht zusammengeführten Werte.


Step 4: PATH sicher bearbeiten (CMD – Warnung)

Gefährliches Beispiel:

setx PATH "%PATH%;C:\Tools"

Warum gefährlich:

  • %PATH% wird expandiert → %SystemRoot% geht verloren
  • REG_EXPAND_SZ → REG_SZ (Problem)
  • Abschneidung bei langen PATH-Werten

Empfehlung: PATH ausschließlich per PowerShell/.NET API bearbeiten.


Step 5: PowerShell – Anzeigen und temporäres Setzen

5-1. Prozessvariablen anzeigen

Get-ChildItem Env:

5-2. Variable anzeigen

$env:<<VAR_NAME>>

5-3. Temporär setzen

$env:<<VAR_NAME>> = "<<VALUE>>"

Step 6: Benutzer- und Systemvariablen korrekt per PowerShell anzeigen

Benutzervariablen

Get-ItemProperty "HKCU:\Environment"

Systemvariablen

Get-ItemProperty "HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager\Environment"

Step 7: Persistentes Setzen per PowerShell (.NET API / Empfohlen)

Benutzer (User)

[System.Environment]::SetEnvironmentVariable("<<VAR_NAME>>","<<VALUE>>","User")

System (Machine, Admin)

[System.Environment]::SetEnvironmentVariable("<<VAR_NAME>>","<<VALUE>>","Machine")

Vorteile:

  • Keine PATH-Abschneidung
  • REG_EXPAND_SZ bleibt erhalten
  • Sicher und kontrolliert

Step 8: PATH sicher erweitern (Empfohlene Methode)

$add = "C:\Tools"
$current = [System.Environment]::GetEnvironmentVariable("PATH","Machine")
$new = ($current.TrimEnd(';') + ';' + $add).Trim(';')
[System.Environment]::SetEnvironmentVariable("PATH",$new,"Machine")

Step 9: Umgebungsvariablen löschen

9-1. Prozess (nur aktuelle PowerShell)

Remove-Item Env:<<VAR_NAME>> -ErrorAction SilentlyContinue

9-2. Dauerhaft löschen

Benutzer

Remove-ItemProperty -Path "HKCU:\Environment" -Name "<<VAR_NAME>>" -ErrorAction SilentlyContinue

System

Remove-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" -Name "<<VAR_NAME>>" -ErrorAction SilentlyContinue

Step 10: Werte aktualisieren und prüfen

10-1. Prozesswert anzeigen

Get-ChildItem Env:<<VAR_NAME>>

10-2. CMD prüfen

echo %<<VAR_NAME>>%

10-3. Dauerhaften Wert erneut laden

$env:<<VAR_NAME>> = [System.Environment]::GetEnvironmentVariable("<<VAR_NAME>>","User")

Step 11: Mehrere Variablen automatisiert setzen

Benutzer

$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")
}

System

$sysVars = @{
  "JAVA_HOME" = "C:\Program Files\Java\<<VALUE>>"
}
foreach ($v in $sysVars.GetEnumerator()) {
  [System.Environment]::SetEnvironmentVariable($v.Key,$v.Value,"Machine")
}

Zusammenfassung

  • Prozess-, Benutzer- und Systemvariablen sind strikt getrennt.
  • CMD und PowerShell zeigen unterschiedliche, teils zusammengeführte Werte.
  • Exakte Werte immer über HKCU/HKLM prüfen.
  • setx ist möglich, aber für PATH ungeeignet.
  • .NET API ist die sicherste und empfohlene Methode.