winlinmac
Goto Top

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.

Content-Key: 152976

Url: https://administrator.de/contentid/152976

Printed on: April 24, 2024 at 17:04 o'clock

Member: Pjordorf
Pjordorf Oct 13, 2010 at 16:11:18 (UTC)
Goto Top
Auch dir Hallo entgegen gebracht!

Zitat von @WinlinMac:
("IP";"MASK";"Gateway";"Metric"):
"0.0.0.0;0.0.0.0;192.168.1.1;20"
Ä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
???

Ich bin mal auf eure antworten gespannt.
Na, ob das alles deinen Erwartungen trifft?

Was hast du den bisher in deiner Batchdatei stehen?

Peter
Member: WinlinMac
WinlinMac Oct 13, 2010 at 16:17:45 (UTC)
Goto Top
Also erstens mein Skript zum auslesen sieht so aus:

@echo offfor /F "tokens=1-15,1-15,1-15,1-15 delims=;" %%i in (portsnow.list) Do echo route -p add %%i mask %%j %%k metric %%l >>doll.cmdecho pause >>doll.cmdpause

portsnow.list enthält:
0.0.0.0;0.0.0.0;192.168.1.2;220.0.0.0;0.0.0.0;192.168.1.1;20


Jetzt brauche ich ein Skript um den output von route print in die form von portsnow.list zu bekommen ist jetzt alles klar?
Member: Friemler
Friemler Oct 13, 2010 at 17:49:59 (UTC)
Goto Top
Hallo WinlinMac,

Zitat von @WinlinMac:
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
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
Member: WinlinMac
WinlinMac Oct 13, 2010 at 18:11:56 (UTC)
Goto Top
Danke funktioniert erstklassik,

MFG

Winlin

Thread gilt als gelöst
Member: Friemler
Friemler Oct 14, 2010 at 13:16:39 (UTC)
Goto Top
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:
===========================================================================
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:"^ .*"
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 face-wink, 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:
@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 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