Per PowerShell auf Umgebungsvariablen zugreifen - das geht ganz einfach.
🎬 Ich habe übrigens auch ein Video zu dem Thema erstellt.

Umgebungsvariable per $Env:-Variable auslesen

Die einfachste Möglichkeit ist per $Env:-Variable. Gebt dafür einfach $Env ein, dann einen Doppelpunkt und dann den Namen der Umgebungsvariable von der ihr den Wert auslesen wollt.

1
$Env:username

Dadurch wird der Username des aktuell angemeldeten Users ausgegeben.

Beispiel Ausgabe von $Env:username in der PowerShell - der aktuelle Username wird angezeigt

Das funktioniert übrigens plattformübergreifend, also auch zum Beispiel unter Linux.

Umgebungsvariablen per PSDrive auslesen

Die Umgebungsvariablen stehen auch als PSDrive - also als PowerShell Laufwerk zur Verfügung. Das heißt ihr könnt auch durch alle Umgebungsvariablen navigieren wie durch ein Dateisystem. Ihr könnt zum Beispiel per Get-ChildItem alle Umgebungsvariablen auflisten.

1
Get-ChildItem Env:

Das ergibt eine nette Auflistung aller Umgebungsvariablen mit den dazugehörigen Werten. Auch das funktioniert plattformübergreifend, also zum Beispiel unter Linux. Beispiel Ausgabe Get-ChildItem Env: in der PowerShell - die Umgebungsvariablen werden aufgelistet

Scopes von Umgebungsvariablen

Unter Windows gibt es drei Bereiche für Umgebungsvariablen (Englisch: Scopes):

  • Machine Scope (teilweise wird der auch System Scope genannt)
  • User Scope
  • Process Scope

Diese drei Scopes stellen eine Hierarchie dar und dementsprechend werden die gesetzten Werte herunter geerbt - es sei denn sie werden in einer niedrigeren Ebene überschrieben. Im nachfolgenden Screenshot ist bei mir zum Beispiel systemweit die Variable “TEMP” auf C:\Windows\Temp gesetzt. Aber im User-Scope wird das überschrieben durch C:\Users\diecknet\AppData\Local\Temp.

Beispiel von Umgebungsvariablen - GUI und PowerShell nebeneinander

Zusätzlich kann es aber auch auf Prozessebene überschrieben werden. In der PowerShell kann ich dafür einfach eine $Env:-Variable nehmen und einen anderen Wert zuweisen.

1
$Env:TEMP = "C:\TEMP"

Für diesen PowerShell Prozess ist der Wert dann anders. Untergeordnete Prozesse werden dann übrigens auch mit den geänderten Umgebungsvariablen gestartet.

Wenn wir jetzt aber eine Umgebungsvariable nicht nur für den aktuellen Prozess-Scope, sondern für den User-Scope oder den System-Scope anpassen wollen, dann geht es leider nicht so einfach wie eine normale Variablenzuweisung in der PowerShell.

Setzen von Umgebungsvariablen in anderen Scopes

Zum Setzen von User-Scope beziehungsweise System-Scope Umgebungsvariablen können wir eine .NET Methode verwenden und zwar:

1
[System.Environment]::SetEnvironmentVariable("Name","Wert","Scope")

Mögliche Werte für den Scope sind dann Machine, User oder Process. Wenn ihr eine systemweite Änderung (also von einer Variable im Machine-Scope) machen wollt, dann braucht ihr Admin-Rechte, sonst schlägt der Vorgang fehl.

1
2
3
4
5
# Beispiel um eine Umgebungsvariable im Machine Scope zu setzen
[System.Environment]::SetEnvironmentVariable("Hallo","TEST","Machine")

# Beispiel um eine Umgebungsvariable im User Scope zu setzen
[System.Environment]::SetEnvironmentVariable("Hallo","TEST","User")

Hinweis: Wenn ihr eine Änderung für eine dieser beiden höheren Ebenen macht, dann wird das nicht automatisch runter geerbt auf den aktuellen schon laufenden PowerShell Prozess. Denn die Umgebungsvariablen werden beim Start des Prozesses geladen.

Umgebungsvariable löschen

Falls ihr eine Umgebungsvariable löschen wollt, dann könnt ihr sie einfach auf einen leeren Wert setzen. Das geht sowohl mit der $Env:-Schreibweise, als auch mit der .NET Methode.

1
2
3
4
5
6
7
# Löschen einer Umgebungsvariable per .NET Methode
[System.Environment]::SetEnvironmentVariable("Kanal","","User")

# Löschen einer Umgebungsvariable per $Env:-Schreibweise
$Env:Test123 = ""
# Löschen einer Umgebungsvariable per $Env:-Schreibweise (so geht's auch)
$Env:Test123 = $null