Permanente Routing-Tabelle sichern. (Batch)
Ich schreibe hier und da Batches zur Simplifizierung von häufigen Abläufen. Sowohl für Windows, Linux/Mac OS x. Allerdings waren alle bisher für meine Verhältnisse relativ einfach zu machen.
Jetzt habe ich ein Problem das ich nicht ohne Fremde Hilfe lösen kann, weil mir die Routine fehlt:
Ich möchte eine Batch schreiben, die die permanenten Routen in einer Textdatei speichert und zwar in der Formatierung ("IP";"MASK";"Gateway";"Metric"):
"0.0.0.0;0.0.0.0;192.168.1.1;20"
Ich habe bisher lediglich einen Skript, der die in dieser Form formatierten Einträge wieder auslesen und in einer Batch schreiben kann, allerdings ist das nach meinem empfinden auch keine Kunst.
Ich bin mal auf eure antworten gespannt. Ich habe bisher immer wieder gute Anregungen auf dieser Seite gefunden.
Jetzt habe ich ein Problem das ich nicht ohne Fremde Hilfe lösen kann, weil mir die Routine fehlt:
Ich möchte eine Batch schreiben, die die permanenten Routen in einer Textdatei speichert und zwar in der Formatierung ("IP";"MASK";"Gateway";"Metric"):
"0.0.0.0;0.0.0.0;192.168.1.1;20"
Ich habe bisher lediglich einen Skript, der die in dieser Form formatierten Einträge wieder auslesen und in einer Batch schreiben kann, allerdings ist das nach meinem empfinden auch keine Kunst.
Ich bin mal auf eure antworten gespannt. Ich habe bisher immer wieder gute Anregungen auf dieser Seite gefunden.
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 152976
Url: https://administrator.de/forum/permanente-routing-tabelle-sichern-batch-152976.html
Ausgedruckt am: 12.05.2025 um 06:05 Uhr
5 Kommentare
Neuester Kommentar
Auch dir Hallo entgegen gebracht!
Äh, was denn jetzt?
"IP";"MASK";"Gateway";"Metric" oder "IP;MASK;Gateway;Metric"?
Was hast du den bisher in deiner Batchdatei stehen?
Peter
Äh, was denn jetzt?
"IP";"MASK";"Gateway";"Metric" oder "IP;MASK;Gateway;Metric"?
Ich habe bisher lediglich einen Skript, der die in dieser Form formatierten Einträge wieder auslesen und in einer Batch
schreiben kann
???schreiben kann
Ich bin mal auf eure antworten gespannt.
Na, ob das alles deinen Erwartungen trifft?Was hast du den bisher in deiner Batchdatei stehen?
Peter
Hallo WinlinMac,
dafür sollte folgendes genügen (wenn noch keine statischen Routen definiert sind):
Dein Skript zum Auslesen von portsnow.list würde ich eher so schreiben:
Durch usebackq kann der Pfad zu portsnow.list auch Leerzeichen enthalten. Was Dein tokens=1-15,1-15,1-15,1-15 soll, verstehe ich nicht.
Gruß
Friemler
Zitat von @WinlinMac:
Jetzt brauche ich ein Skript um den output von route print in die form von portsnow.list zu bekommen
Jetzt brauche ich ein Skript um den output von route print in die form von portsnow.list zu bekommen
dafür sollte folgendes genügen (wenn noch keine statischen Routen definiert sind):
for /f "skip=1 tokens=1-3,5" %%a in ('route print ^| findstr /r /c:"^ .*"') do (
if "%%a" neq "Keine" echo %%a;%%b;%%c;%%d>>portsnow.list
)
Dein Skript zum Auslesen von portsnow.list würde ich eher so schreiben:
for /F "usebackq tokens=1-4 delims=;" %%i in ("portsnow.list") do (
echo route -p add %%i mask %%j %%k metric %%l>>doll.cmd
)
echo pause>>doll.cmd
pause
Gruß
Friemler
Hallo WinlinMac,
auf Deine Nachfrage per PN liefere ich die Erklärung zu meinem Schnipsel hier im Thread, damit auch andere etwas davon haben.
Zunächst mal die Ausgabe von ROUTE PRINT:
Und Mein Schnipsel:
Die FOR /F Schleife zerlegt zeilenweise die Ausgabe des Befehls, der in der Klammer der Schleife zwischen einfachen Anführungszeichen angegeben wird (hier 'route print ^| findstr /r /c:"^ .*"'), in seine "Bestandteile" (Tokens). Dabei werden bestimmte Zeichen, die zusammen mit TOKENS= in den doppelten Anführungszeichen durch die Direktive DELIMS= festgelegt werden können, als Trennzeichen zwischen den Bestandteilen/Tokens betrachtet. Wenn DELIMS nicht angegeben wird, werden Leer- und Tabzeichen als Trennzeichen betrachtet, so auch in diesem Fall. Die Eingabe von FOR /? an der Kommandozeile liefert die Hilfe zum FOR-Befehl.
In der Ausgabe von ROUTE PRINT interessieren Dich die Zeilen 9-15 mit den Netzwerkadressen/-masken. Die Spalten Netzwerkziel, Netzwerkmaske, Gateway, Schnittstelle und Anzahl sind durch Leer- bzw. Tabzeichen getrennt (die Standard-Trennzeichen). Ohne Angabe von TOKENS=1-3,5 würde nur der Inhalt der Spalte Netzwerkziel zurückgeliefert und der Laufvariablen %%a zugewiesen (das 1. Token). Durch TOKENS=1-3,5 werden aber automatisch weitere Laufvariablen (%%b, %%c und %%d) erzeugt. Dabei enthält %%b den Inhalt der Spalte Netzwerkmaske (2. Token), %%c den Inhalt der Spalte Gateway (3. Token) und %%d den Inhalt der Spalte Anzahl (5. Token).
Damit von der Ausgabe von ROUTE PRINT nur die Zeilen 9-15 verarbeitet werden, wird die gesamte Ausgabe über eine Pipeline an den FINDSTR-Befehl weitergegeben. Dafür steht das ^|, wobei das ^ ein Escape-Zeichen für | ist, damit der Befehlsinterpreter die Zeile korrekt auswertet. Um den Befehl direkt an der Kommandozeile auszuführen, müsstest Du nur
eingeben. Durch die Parameter /r /c:"^ .*" wird dem FINDSTR-Befehl mitgeteilt, was er suchen soll. Durch /r wird festgelegt, das der Suchstring, trotz /c:, ein regulärer Ausdruck ist, denn /c: legt eigentlich fest, das nach dem Suchstring buchstabengetreu gesucht werden soll. "^ .*" ist der Suchstring. Dabei bedeutet das ^, das am Anfang einer Zeile gesucht werden soll. Gesucht werden soll nach einem Leerzeichen, dem beliebig viele beliebige Zeichen folgen (dafür das " .*"). Der Punkt steht für ein beliebiges Zeichen, der Stern für eine beliebig häufige Wiederholung des vorhergehenden Zeichen (wegen dem vorhergehenden Punkt also für das beliebig häufige Auftreten eines beliebigen Zeichens). Falls Dir das jetzt zu hoch ist
, gib FINDSTR /? an der Kommandozeile ein, das liefert die Hilfe zum Befehl und experimentiere ein wenig mit FINDSTR herum.
Es wird also nach Zeilen gesucht, die mit einem Leerzeichen beginnen und diese ausgegeben, also von der FOR-Schleife verarbeitet. Darunter fallen auch die Zeile 8 mit den Spaltentiteln (Netzwerkziel, Netzwerkmaske, usw.) und die Zeile 19 mit dem Wort "Keine". Zeile 8 (in der Ausgabe des FINDSTR-Befehls die erste Zeile) wird durch SKIP=1 (überspringe die erste Zeile) herausgefiltert. Zeile 19 wird durch IF "%%a" NEQ "Keine" herausgefiltert, denn bei Verarbeitung dieser Zeile enthält %%a das Wort "Keine", das erste und einzige Token dieser Zeile.
PS:
Wenn ich es mir so recht überlege, frage ich mich, ob der Schnipsel wirklich nützlich für Dich ist. Du willst doch bestimmt die statischen Routen eines Rechners auslesen und auf einen anderen übertragen. Dann wären die Zeilen nach der Zeile 18 ("Ständige Routen") für dich interessant und das Skript müsste anders geschrieben werden. Und zwar so:
In der ersten FOR-Schleife wird die Nummer der Zeile ermittelt, die mit "Ständige Routen" beginnt. FINDSTR gibt durch den Parameter /n vor dem Inhalt der Zeile die Zeilennummer gefolgt von einem Doppelpunkt aus, deshalb DELIMS=:. Die Laufvariable %%l enthält also die Zeilennummer der gesuchten Zeile, die um eins erhöht an die Variable skipLines zugewiesen wird. Dadurch wird auch die Zeile mit den Spaltenbezeichnungen der statischen Routen übersprungen. Der Parameter /a beim SET-Befehl ermöglicht es, auf der rechten Seite des Gleichheitszeichens Berechnungen durchzuführen.
In der zweiten FOR-Schleife wird durch SKIP=%skipLines% die entsprechende Anzahl Zeilen von der Ausgabe des ROUTE PRINT-Befehls übersprungen. Die Tabelle der statischen Routen wird durch TOKENS=1-4 und das fehlende DELIMS pro Zeile in vier Tokens zerlegt, die durch Leerzeichen getrennt sind und den Laufvariablen %%a, %%b, %%c und %%d zugewiesen werden.
Gruß
Friemler
auf Deine Nachfrage per PN liefere ich die Erklärung zu meinem Schnipsel hier im Thread, damit auch andere etwas davon haben.
Zunächst mal die Ausgabe von ROUTE PRINT:
===========================================================================
Schnittstellenliste
0x1 ........................... MS TCP Loopback interface
0x2 ...0X XX XX XX XX XX ...... MAC-Brückenminiport - Paketplaner-Miniport
===========================================================================
===========================================================================
Aktive Routen:
Netzwerkziel Netzwerkmaske Gateway Schnittstelle Anzahl
0.0.0.0 0.0.0.0 192.168.XXX.XXX 192.168.XXX.XXX 20
127.0.0.0 255.0.0.0 127.0.0.1 127.0.0.1 1
192.168.XXX.0 255.255.255.0 192.168.XXX.XXX 192.168.XXX.XXX 20
192.168.XXX.XXX 255.255.255.255 127.0.0.1 127.0.0.1 20
192.168.XXX.255 255.255.255.255 192.168.XXX.XXX 192.168.XXX.XXX 20
224.0.0.0 240.0.0.0 192.168.XXX.XXX 192.168.XXX.XXX 20
255.255.255.255 255.255.255.255 192.168.XXX.XXX 192.168.XXX.XXX 1
Standardgateway: 192.168.XXX.XXX
===========================================================================
Ständige Routen:
Keine
Und Mein Schnipsel:
for /f "skip=1 tokens=1-3,5" %%a in ('route print ^| findstr /r /c:"^ .*"') do (
if "%%a" neq "Keine" echo %%a;%%b;%%c;%%d>>portsnow.list
)
Die FOR /F Schleife zerlegt zeilenweise die Ausgabe des Befehls, der in der Klammer der Schleife zwischen einfachen Anführungszeichen angegeben wird (hier 'route print ^| findstr /r /c:"^ .*"'), in seine "Bestandteile" (Tokens). Dabei werden bestimmte Zeichen, die zusammen mit TOKENS= in den doppelten Anführungszeichen durch die Direktive DELIMS= festgelegt werden können, als Trennzeichen zwischen den Bestandteilen/Tokens betrachtet. Wenn DELIMS nicht angegeben wird, werden Leer- und Tabzeichen als Trennzeichen betrachtet, so auch in diesem Fall. Die Eingabe von FOR /? an der Kommandozeile liefert die Hilfe zum FOR-Befehl.
In der Ausgabe von ROUTE PRINT interessieren Dich die Zeilen 9-15 mit den Netzwerkadressen/-masken. Die Spalten Netzwerkziel, Netzwerkmaske, Gateway, Schnittstelle und Anzahl sind durch Leer- bzw. Tabzeichen getrennt (die Standard-Trennzeichen). Ohne Angabe von TOKENS=1-3,5 würde nur der Inhalt der Spalte Netzwerkziel zurückgeliefert und der Laufvariablen %%a zugewiesen (das 1. Token). Durch TOKENS=1-3,5 werden aber automatisch weitere Laufvariablen (%%b, %%c und %%d) erzeugt. Dabei enthält %%b den Inhalt der Spalte Netzwerkmaske (2. Token), %%c den Inhalt der Spalte Gateway (3. Token) und %%d den Inhalt der Spalte Anzahl (5. Token).
Damit von der Ausgabe von ROUTE PRINT nur die Zeilen 9-15 verarbeitet werden, wird die gesamte Ausgabe über eine Pipeline an den FINDSTR-Befehl weitergegeben. Dafür steht das ^|, wobei das ^ ein Escape-Zeichen für | ist, damit der Befehlsinterpreter die Zeile korrekt auswertet. Um den Befehl direkt an der Kommandozeile auszuführen, müsstest Du nur
route print | findstr /r /c:"^ .*"
Es wird also nach Zeilen gesucht, die mit einem Leerzeichen beginnen und diese ausgegeben, also von der FOR-Schleife verarbeitet. Darunter fallen auch die Zeile 8 mit den Spaltentiteln (Netzwerkziel, Netzwerkmaske, usw.) und die Zeile 19 mit dem Wort "Keine". Zeile 8 (in der Ausgabe des FINDSTR-Befehls die erste Zeile) wird durch SKIP=1 (überspringe die erste Zeile) herausgefiltert. Zeile 19 wird durch IF "%%a" NEQ "Keine" herausgefiltert, denn bei Verarbeitung dieser Zeile enthält %%a das Wort "Keine", das erste und einzige Token dieser Zeile.
PS:
Wenn ich es mir so recht überlege, frage ich mich, ob der Schnipsel wirklich nützlich für Dich ist. Du willst doch bestimmt die statischen Routen eines Rechners auslesen und auf einen anderen übertragen. Dann wären die Zeilen nach der Zeile 18 ("Ständige Routen") für dich interessant und das Skript müsste anders geschrieben werden. Und zwar so:
@echo off
setlocal
for /f "delims=:" %%l in ('route print ^| findstr /n /r /c:"^Ständige Routen"') do (
set /a "skipLines=%%l+1"
)
for /f "skip=%skipLines% tokens=1-4" %%a in ('route print') do (
echo %%a;%%b;%%c;%%d>>portsnow.list
)
endlocal
In der zweiten FOR-Schleife wird durch SKIP=%skipLines% die entsprechende Anzahl Zeilen von der Ausgabe des ROUTE PRINT-Befehls übersprungen. Die Tabelle der statischen Routen wird durch TOKENS=1-4 und das fehlende DELIMS pro Zeile in vier Tokens zerlegt, die durch Leerzeichen getrennt sind und den Laufvariablen %%a, %%b, %%c und %%d zugewiesen werden.
Gruß
Friemler