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