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.

    Täglich Know-how für IT-Pros mit unserem Newsletter

    Wir ver­wenden Ihre Mail-Adresse nur für den Ver­sand der News­letter.
    Es erfolgt keine per­sonen­be­zogene Auswertung.

    Bild von Wolfgang Sommergut
    Wolfgang Sommergut hat lang­jährige Erfahrung als Fach­autor, Berater und Kon­ferenz­sprecher zu ver­schie­denen Themen der IT. Da­ne­ben war er als System­ad­mi­ni­stra­tor und Con­sultant tätig.
    // Kontakt: E-Mail, XING, LinkedIn //

    Verwandte Beiträge

    Weitere Links

    4 Kommentare

    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.

    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).

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

    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