Windows-Netzwerkeinstellungen einfach umschalten

Seite 3: Batch-Magie

Inhaltsverzeichnis

Mit Windows-Bordmitteln lässt sich das Umschalten zwischen Netzwerk-Konfigurationen vereinfachen.

Die Technik ist von Perl abgeschaut. Wenn dort ein Skript mit der optionalen __END__-Zeile endet, kann der Programmierer alle Zeilen, die danach folgen, mit einer Konstruktion wie while(<DATA>){… als Eingabe benutzen. Da der Batch-Interpreter cmd.exe diese Funktion nicht selbst anbietet, muss man sie zu Fuß nachbauen.

Als Ende-Marker dient die letzte Zeile, die nur exit /b enthält. Um als Eingabe die Zeilen danach zu nutzen, muss das Skript sich selbst einlesen und dabei die Befehle bis zum Marker überspringen. Dazu eignet sich der Befehl more, der mit dem Parameter +n aufgerufen die ersten n Zeilen überspringt und den Rest ausgibt. Seinen eigenen Namen findet das Skript in der Variablen %0, am besten in der Form %~s0, also als kurzer Dateiname ohne Anführungszeichen.

Es fehlt nur noch ein Mechanismus, um die Zeilennummer automatisch herauszufinden und sie an more weiterzugeben. Der Aufruf

findstr /N /X /C:"exit /b" %~s0

sucht Zeilen, die nichts anderes enthalten (/X) als den exakten String (/C). Ohne /C wĂĽrde findstr nach "exit" oder "/b" suchen. Der Parameter /N veranlasst findstr, jeder Fundstelle die Zeilennummer voranzustellen, also zum Beispiel

17:exit /b

Die Nummer extrahiert ein for-Befehl:

for /f "delims=:" %%i in ('findstr /N /X /C:"exit /b" %~s0') do set more=+%%i

Dabei arbeitet for alle Ausgabezeilen des bekannten findstr-Befehls ab und teil sie am Doppelpunkt (delims=:). Den ersten Teil weist es der Variable %i zu. Der set-Befehl stellt der Nummer ein Plus voran und speichert sie in der Variablen more. Am Ende der for-Schleife enthält also die Variable more ein Plus gefolgt von der Zeilennummer der letzten Fundstelle aus dem findstr-Befehl.

Nun genĂĽgt der Aufruf

more %~s0 | netsh

um alle Zeilen nach dem letzten exit /b als Eingabe an netsh weiterzugeben, denn das Programm more ĂĽbernimmt automatisch den Inhalt der Variablen more auf seine Kommandozeile. Es erkennt auĂźerdem, dass seine Ausgabe nicht auf den Bildschirm geht, sondern per Pipe an ein anderes Programm und unterbricht sich daher nicht nach jeweils einer BildschirmfĂĽllung.

Im Kern besteht also ein Skript "LAN.cmd" zum Wiederherstellen der Konfiguration aus der for-Zeile, dem more-Aufruf und der Zeile exit /b. Daran hängt man mit

netsh interface ip dump >>LAN.cmd

die aktuelle TCP/IP-Konfiguration. Das ist so einfach, dass es sogar ein anderes Batch-Skript kann, nämlich das eben erwähnte "Netzwerkeinstellungen speichern.cmd".

Um wie versprochen auch die Proxy-Einstellungen zu sichern, geht es etwas weiter und schreibt hinter den netsh-Dump die Zeile exit #netsh. Wenn das Wiederherstellungs-Skript diese Zeile später an netsh verfüttert, beendet sich dieses sofort und alle weiteren Zeilen landen im Nirwana. So können weiter Daten an das Skript angehängt werden, die netsh nicht zu sehen bekommt. Das Hash-Zeichen leitet in netsh einen Kommentar ein. Der Zusatz "#netsh" stört daher nicht, macht diese Zeile aber innerhalb des Wiederherstellungs-Skripts einmalig. Damit eignet sie sich – Sie ahnen es – wieder als Marker für den oben beschriebenen Batch-Kniff.

Hier folgen nämlich noch die Proxy-Einstellungen, die das Sicherungs-Skript aus der Registry holt und in Form einer regedit-Datei an das erzeugte Skript anhängt. Das Wiederherstellungs-Skript durchsucht sich wie beschrieben selbst nach exit #netsh und schreibt alles darauf folgende in eine temporäre Datei. Die fügt es mit einem regedit-Befehl in die Registry ein, und schon sind alle Proxy-Einstellungen wiederhergestellt.

Das Sicherungs-Skript lässt sich leicht anpassen, um auch andere Teile der Registry mit in die einzelnen Skripte zu schreiben. Wer also die Einstellungen anderer Browser oder E-Mail-Programme mit sichern will, muss nur den markierten Bereich aus dem Skript kopieren und an seine Bedürfnisse anpassen. Um solche Erweiterungen weiterzugeben sollten Sie das Forum zu diesem Artikel benutzen. (je)