setx: Umgebungsvariablen mit Werten aus Datei oder Registry setzen


    Tags: ,

    Der interne SET-Befehl des Kommandointerpreters kann nur Variablen in der eigenen Umgebung von cmd.exe setzen, ändern oder löschen. Der normale Weg zur Bearbeitung von permanenten User- oder Systemvariablen führt über die grafische Oberfläche (sysdm.cpl => Erweitert => Umgebungsvariablen). Eine flexiblere Alternative ist das Kommandozeilen-Tool setx, das nicht nur konstante Werte in der Umgebung speichern kann. In Batchdateien lässt sich die Intelligenz des Programms leider nicht nutzen.

    In der einfachsten Variante ruft man das Dienstprogramm auf wie den internen SET-Befehl auf, indem man einer Variable einen konstanten Wert zuweist. Die Syntax dafür kommt aber ohne Gleichheitszeichen aus, also beispielsweise setx MACHINE HP. Statt einer Konstante lässt sich hier auch eine andere Umgebungsvariable einsetzen. Ergänzt man den Schalter /m, dann gilt die Variable nicht nur im Kontext des Benutzers, sondern systemweit.

    Auslesen von Werten aus Dateien oder Registry-Schlüsseln

    Für diese einfache Verwendung von setx spricht nicht viel, da sich Konstante in Umgebungsvariablen besser über Group Policy Preferences zentral für ausge­wählte Benutzer oder Computer setzen lassen. Die Stärke des Tools besteht in der Möglichkeit, Werte aus Dateien oder der Registrierdatenbank auszulesen und in Umgebungsvariablen zu übernehmen. Im Fall von Registry-Schlüsseln funktioniert dies relativ einfach, weil es sich dabei um strukturierte Daten handelt. Es gilt allerdings die Einschränkung, dass setx nur auf die Zweige unterhalb von HKEY_CURRENT_USER und HKEY_LOCAL_MACHINE zugreifen kann. Zum Beispiel würde

    setx WP /K HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\14.0\Word\InstallRoot\Path

    das Installationsverzeichnis von Word 2010 ermitteln und in die Variable WP schreiben.

    Dateien durchsuchen und parsen

    Interessant sind die Funktionen, die setx zum Auslesen von Dateien bietet. Diese lassen sich mit Hilfe von Trennzeichen (Delimiter) in Felder unterteilen, auf die gezielt über Koordinaten zugegriffen werden kann. So ließe sich aus einer CSV-Datei, die ein Semikolon als Trennzeichen verwendet, mit

    setx FELD /F input.csv /A 2,1 /D ";"

    der Wert aus der 2. Spalte in der 3. Zeile extrahieren (die Zählung beginnt bei 0). Die Parsing-Möglichkeiten von setx gehen sogar so weit, dass man Koordinaten relativ zur ersten Fundstelle eines Suchbegriffs definieren kann. So ließe sich mit dem Befehl

    setx HOST /F hosts /R 0,1 "102.54.94.97" /D " "

    der Hostname rhino.acme.com für die IP-Adresse 102.54.94.97 aus der exemplarischen hosts.sam extrahieren.

    Diese Fähigkeiten, Dateien zu parsen, haben unter den Kommandozeilen-Tools von Windows Seltenheitswert. Daher wären sie eine willkommene Bereicherung für die Batchdateien, wo man verschiedene Werte aus Dateien oder der Registry auslesen, diese prüfen oder damit Dateinamen erzeugen könnte.

    Dies scheitert aber daran, dass setx nicht in die lokale Umgebung des Kommandointerpreters schreiben kann. Die Systemvariablen werden erst in einer neuen Instanz von cmd.exe wirksam, so dass sie innerhalb der Stapelverarbeitung nicht verfügbar sind, nachdem sie unmittelbar vorher gesetzt wurden.

    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

    3 Kommentare

    Nettes Tool, guter Artikel - Danke!
    Was mich allerdings immer wieder wundert, ist die Tatsache, dass POWERSHELL auf dieser Seite (und ähnlichen Angeboten) keine Erwähnung findet. Also wenn man über "Kommandozeilen" spricht, sollte man die eierlegende Wollmichsau von MS schon mit in Betracht ziehen, oder? Wie wäre es mal mit ein paar einleitenden Artikel darüber oder auch einfach nur den Hinweis, dass man das mit PS auch gut (oder besser) hinbekommt?

    Bild von Wolfgang Sommergut

    Keine Frage, Powershell ist wirklich die eierlegende Wollmichsau, mit der man in MS-Umgebungen fast alle Aufgaben automatisieren kann. Allerdings erfordert sie einen nicht unerheblichen Lernaufwand, den viele Admins bisher noch gescheut haben.

    Und mir geht es da ähnlich, ich nehme mir schon lange vor, mich intensiver mit PS zu beschäftigen, habe es bisher jedoch nicht geschafft. Und da ich mich noch nicht genug damit auskenne, schreibe ich nur selten darüber ...

    "Die Systemvariablen werden erst in einer neuen Instanz von cmd.exe wirksam, so dass sie innerhalb der Stapelverarbeitung nicht verfügbar sind, nachdem sie unmittelbar vorher gesetzt wurden."

    Wenn man zeitgesteuert einen Batch-Vorgang ausführen will, kann man folgenden Umweg gehen:
    Mit Taskplaner Variable per Batch erzeugen,
    mit Taskplaner im Anschluß eigentliche Batch-Datei starten, der dann die Variable zu Verfügung steht.

    Für event gesteuerte Batches (z.B Systemstart o. Shutdown) hab ich noch keine Idee.