Umgebungsvariablen setzen, anzeigen und löschen mit PowerShell


    Tags:

    Wie alle anderen Programme erhält auch PowerShell beim Start eine Kopie des Master-Environments mit allen darin enthaltenen Variablen. Diese kann man auslesen, neue setzen oder vorhandene löschen. Wie schon bei cmd.exe oder anderen Shells wirken sich diese Operationen nur auf die aktuelle Instanz von PowerShell aus.

    Während PowerShell einige wichtige Kommandos von cmd.exe durch Aliase nachbildet, trifft dies auf den Befehl SET nicht zu. Der ist unter PowerShell als Alias für Set-Variable vordefiniert und hilft damit nicht bei der Bearbeitung des Environments.

    Variablen mit Get-ChildItem auflisten

    Wer mit den grundlegenden Cmdlets von PowerShell vertraut ist, wird beim Zugriff auf Umgebungsvariablen alte Bekannte wiedertreffen. Das Cmdlet Get-ChildItem, das den Inhalt von Verzeichnissen auflisten und Schlüssel der Registry anzeigen kann, dient auch dazu, die Umgebung auszulesen.

    Während Präfixe HKLM: wie HKCU:, die für Wurzelknoten der Registry-Bäume stehen, dem Cmdlet Get-ChildItem signalisieren, dass Werte aus der Registrierdatenbank ausgelesen werden sollen, spricht man die Umgebung mit env: an. Um wie mit SET unter cmd.exe alle Variablen anzuzeigen, gibt man daher einfach

    Get-ChildItem env:

    ein. Möchte man nur den Wert einer Variablen wissen, dann erhält man diesen beispielsweise mit

    Get-ChildItem env:windir

    Die Verwendung von Wildcards ist wie beim Anzeigen von Dateien auch bei Umgebungsvariablen möglich, so zeigt der Aufruf unter Verwendung des Alias gci

    gci env:user*

    unter anderem die Werte von %username% oder %userprofile%.

    Umgebungsvariablen als PowerShell-Variablen verfügbar

    Um einzelne Variablen zu verwenden, muss man allerdings nicht Get-ChildItem bemühen, vielmehr sind sie von Anfang an als PowerShell-Variablen ansprechbar. Daher enthält etwa $env:PATH den Wert des Suchpfades. Nach diesem Muster kann man auf die gesamte Umgebung zugreifen. Ein angenehmer Nebeneffekt davon ist für Variablen mit langen Namen, dass beim Tippen die Autovervollständigung mittels TAB-Taste funktioniert.

    Anwendung von String-Funktionen

    PowerShell repräsentiert sämtliche Umgebungsvariablen als String-Objekte, so dass automatisch alle dafür vorhandenen Eigenschaften und Methoden zur Verfügung stehen. So ließe sich etwa mittels

    $env:PATH.contains("c:\test")

    überprüfen, ob das Verzeichnis c:\test im Pfad enthalten ist. Es dabei zu beachten, dass contains() zwischen Groß- und Kleinschreibung unterscheidet.

    Werte für Umgebungsvariablen setzen

    Will man einen Wert an eine bestehende Variable anhängen, dann geht das einfach über die Konkatenation von Strings:

    $env:PATH += "c:\test"

    Existiert eine Umgebungsvariable noch nicht, dann kann man sie einfach wie eine normale PowerShell-Variable erzeugen, nur mit dem Unterschied, dass sie das env:-Präfix enthalten muss:

    $env:test="Anlegen einer Umgebungsvariablen in PowerShell"

    Auf die gleiche Weise lässt sich der Wert einer bestehenden Variablen mit einem neuen Inhalt überschreiben.

    Umgebungsvariablen entfernen

    Für das Löschen von Umgebungsvariablen ist wieder ein Cmdlet zuständig, das die gleiche Aufgabe bereits für Dateien und Registry-Schlüssel übernimmt. Es handelt sich dabei um Remove-Item, dem man nach dem Muster

    Remove-Item env:\test, env:\myVar

    eine oder mehrere Variablen als Parameter übergibt. Zulässig ist auch hier die Verwendung von Wildcards.

    4 Kommentare

    Bild von Christoph
    Christoph sagt:
    6. Mai 2015 - 16:58

    Die Anleitung
    $env:test="Anlegen einer Umgebungsvariablen in PowerShell"
    ist zwar gut für das Setzen der Umgebungsvariablen innerhalb der Powershell, gibt aber keine Auskunft darüber, wie man systemweit eine globale Umgebungsvariable anlegt. Ich möchte eine Umgebungsvariable in Server 2012 R2 setzen, z.B. SID=ORCL, so daß jeder Prozeß, also z.B. auch ein Visual Studio, das ich vom Desktop aus starte, diese kennt.
    Unter Windows7 ist das kein Problem, aber unter Server 2012 sucht man Stunden und ist noch keinen Schritt weiter.

    Bild von Matthias
    Matthias sagt:
    5. Januar 2017 - 10:27

    Versuche es mit

    $Name = Variablenname
    $Wert = Pfad

    [Environment]::SetEnvironmentVariable("$Name", "$Wert", "Machine")

    Machine setzt die Umgebungsvariable systemweit. Daneben gibt es noch User und Process (flüchtig).

    Bild von Matandra
    Matandra sagt:
    1. März 2017 - 20:47

    Kleiner Hinweis: der Typ wird hierbei leider immer auf REG_SZ gesetzt. Auch bei einer vorhandenen Variable bleibt der Typ nicht erhalten

    Bild von adelphos
    adelphos sagt:
    16. Juli 2016 - 9:37

    Meine Bemerkung zu:

    Remove-Item env:\test

    => der Backslash ist da dieser Stelle unnötig, es geht auch mit:

    Remove-Item env:test

    => Das Anlegen geschah ja auch ohne Backslash via:

    $env:test="Anlegen einer Umgebungsvariablen in PowerShell"

    So ist es syntaktisch logischer.

    MfG,
    Adelphos