Windows-omgevingsvariabelen: Weergeven, instellen en permanent opslaan via CMD en PowerShell

Overzicht

Windows maakt bij het starten van een proces een afzonderlijke environment-block aan. Dit artikel legt exact uit hoe omgevingsvariabelen werken, wat het verschil is tussen proces-, gebruikers- en systeemvariabelen, hoe ze worden opgeslagen, en hoe je ze via CMD en PowerShell correct uitleest, instelt en persistent maakt.


Notatie van variabelen

Naam Voorbeeld Beschrijving
<<VAR_NAME>> PATH Naam van de doelvariabele
<<VALUE>> C:\Tools In te stellen waarde

Step 1: Scope en opslaglocatie van omgevingsvariabelen

Type Locatie Bereik Permanent Opmerking
Procesvariabelen Geheugen Alleen huidig proces Tijdelijk CMD: set / PowerShell: $env:
Gebruikersvariabelen HKCU\Environment Huidige gebruiker Permanent setx / .NET API
Systeemvariabelen HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment Alle gebruikers Permanent setx /M / .NET API (Administrator)

Proces, gebruiker en systeem zijn strikt gescheiden

  • Procesvariabelen: uitsluitend voor de huidige shell
  • Gebruikersvariabelen: per gebruiker
  • Systeemvariabelen: globaal voor alle gebruikers
  • PATH wordt vaak samengesteld getoond: SysteemPATH + GebruikerPATH

Step 2: CMD (%VAR%) – Weergeven en instellen

2-1. Procesvariabelen weergeven

set

2-2. Variabele weergeven

echo %<<VAR_NAME>>%

2-3. Tijdelijk instellen (alleen huidige CMD)

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

Step 2-4. Permanent instellen (setx)

Gebruiker (default)

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

Systeem (Admin, /M verplicht)

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

Kenmerken van setx:

  • Geldt niet voor de huidige CMD-sessie
  • %PATH% wordt geëxpandeerd en permanent vastgezet
  • Langere waarden kunnen afgesneden worden

Step 3: Gebruiker- en systeemvariabelen via CMD controleren

Gebruikersvariabelen

reg query HKCU\Environment

Systeemvariabelen

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

Toont exact de ruwe, niet-samengevoegde waarden.


Step 4: PATH veilig bewerken (CMD – Risico)

Niet aanbevolen voorbeeld:

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

Problemen:

  • %PATH% wordt volledig geëxpandeerd → verlies van %SystemRoot%
  • REG_EXPAND_SZ → REG_SZ
  • Afkapping bij lange PATH-waarden

Gebruik altijd PowerShell/.NET API voor PATH-beheer.


Step 5: PowerShell – Weergeven en tijdelijk instellen

5-1. Procesvariabelen weergeven

Get-ChildItem Env:

5-2. Variabele weergeven

$env:<<VAR_NAME>>

5-3. Tijdelijk instellen

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

Step 6: Gebruiker- en systeemvariabelen exact uitlezen via PowerShell

Gebruikersvariabelen

Get-ItemProperty "HKCU:\Environment"

Systeemvariabelen

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

Step 7: Permanent instellen via PowerShell (.NET API / Aanbevolen)

Gebruiker

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

Systeem (Admin)

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

Voordelen:

  • Geen PATH-afsnijding
  • REG_EXPAND_SZ blijft behouden
  • Waarden worden veilig bijgewerkt

Step 8: PATH veilig uitbreiden (.NET API / Best practice)

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

Step 9: Variabelen verwijderen

9-1. Proces (enkel huidige PowerShell)

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

9-2. Permanent verwijderen (Registry)

Gebruiker

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

Systeem

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

Step 10: Waarden toepassen en controleren

10-1. Proceswaarde controleren

Get-ChildItem Env:<<VAR_NAME>>

10-2. CMD-controle

echo %<<VAR_NAME>>%

10-3. Persistente waarde opnieuw laden

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

Step 11: Meerdere variabelen in één keer instellen

Gebruikersvariabelen

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

Systeemvariabelen

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

Samenvatting

  • Proces-, gebruiker- en systeemvariabelen bestaan onafhankelijk van elkaar.
  • CMD en PowerShell tonen verschillende samengestelde waarden.
  • Gebruik HKCU/HKLM om de echte waarden te zien.
  • setx is bruikbaar, maar ongeschikt voor PATH.
  • De .NET API is de meest veilige en betrouwbare methode.