Tags: Windows, Kommandozeile
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 ausgewä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
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?
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.