boory01
Goto Top

In mehrzeiliger Textdatei verschiedene Zeilen auslesen und in Variablen aufsplitten

Hallo Forum,

ich möchte per Batch Datenreihen aus einer Textdatei verwerten.

Hintergrund:

Es sollen IP-Einträge gesetzt werden, die für verschiedene Rechner in einer textdatei vordefiniert werden.
Beispiel:

Settings.txt
PC1 | 192.168.10.10 | 192.168.10.1 | 255.255.255.192 | etc....
PC2 | 192.168.10.11 | 192.168.10.1 | 255.255.255.192 | etc....
PC3 | 192.168.10.12 | 192.168.10.1 | 255.255.255.192 | etc....
PC4 | 192.168.10.13 | 192.168.10.1 | 255.255.255.192 | etc....

Ich will nun den Benutzer der Datei (Administratorrechte vorhanden) auffordern, die Kennung des PCs einzugeben.
Die Batch soll nun in der Settings.txt zu der Zeile springen, in der beispielsweise "PC2" steht. Nun sollen die
einzelnen Columns als Variablen in die entsprechend definierten Stellen in der Batch eingefügt werden. Also so:

IP-Adresse soll sein IP
Subnetzadresse soll sein SN
Gateway soll sein GW
etc...

netsh interface ipv4 set address "LAN-Verbindung" static %IP% %SN% %GW% 1

Mein Problem ist nun, wie kann ich erreichen, dass die einzelnen Columns so definiert werden, wie ich sie brauche?
Mir fehlt da komplett der Ansatz... face-smile

Also
1. Wie springe ich in die entsprechende Zeile der Datei "Settings.txt", die der User vorgibt und
2. wie definiere ich die Columns so, dass eben bei IP die IP-Adresse, bei SN die Subnetz-Adresse etc. übergeben wird?

Schon mal vielen Dank für Eure Hilfe!

Content-Key: 274617

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

Printed on: April 23, 2024 at 09:04 o'clock

Member: Friemler
Solution Friemler Jun 15, 2015, updated at Jun 17, 2015 at 18:32:36 (UTC)
Goto Top
Hallo Boory01,

hier ein Schnipsel, den Du an Deine Bedürfnisse anpassen kannst:
@echo off & setlocal

set /p "CompName="  
echo.

set "SettingsFile=.\settings.txt"  
set "Found="  
set "IP="  
set "SN="  
set "GW="  

for /f "tokens=2-4 delims=|" %%a in ('findstr /i /b /c:"%CompName%" "%SettingsFile%"') do (  
  set "Found=1"  
  for /f %%A in ("%%a") do set "IP=%%A"  
  for /f %%A in ("%%c") do set "SN=%%A"  
  for /f %%A in ("%%b") do set "GW=%%A"  
)

if defined Found (
  echo IP:      %IP%
  echo Subnet:  %SN%
  echo Gateway: %GW%
  echo.
) else (
  echo PC-Name ist unbekannt.
  echo.
)

Siehe auch mein Tutorial zur FOR-Schleife.

In Zeile 6 musst Du den Pfad zur Settings-Datei eintragen. Die FOR-Schleifen in den Zeilen 14-16 entfernen führende und angehängte Leerzeichen.

Gruß
Friemler
Member: Boory01
Boory01 Jun 15, 2015 at 15:37:45 (UTC)
Goto Top
Hallo Friemler,

nach erstem Check kommt das schon (fast) ohne Anpassung sehr nah an das heran, was ich brauche. Klasse!!! face-smile

Zum Verständnis:
Mit dem Eintrag bei "tokens" werden in Deinem Schnipsel durch 2-4 die Columns definiert, auf die zugegriffen wird, richtig?
Das würde heißen, wenn ich mehr Variablen haben sollte, würden sich diese Einträge auf z.B. 2-7 erweitern, wobei Column
Nummer 1 ja der führende Eintrag ist, nachdem die ganze Zeile angewählt wird.
Wenn ich dann die Einträge für "if defined Found" erweitern will, müsste ich dann auch die oberen "for /f %%A"-Einträge
anpassen. Nun hast Du von oben nach unten ja %%a, %%c und %%b gesetzt. Hat diese Reihenfolge einen Hintergrund
oder ist das egal und ich könnte dann in folgenden "For"-Schleifen mit %%d, %%e, %%f... weitermachen?
Member: Friemler
Solution Friemler Jun 15, 2015, updated at Jun 17, 2015 at 18:32:50 (UTC)
Goto Top
Hallo Boory01,

Mit dem Eintrag bei "tokens" werden in Deinem Schnipsel durch 2-4 die Columns definiert, auf die zugegriffen wird, richtig?
Ja, richtig.

Das würde heißen, wenn ich mehr Variablen haben sollte, würden sich diese Einträge auf z.B. 2-7 erweitern,
Ja, richtig. Allerdings kann die FOR-Schleife maximal 31 Tokens verarbeiten, d.h. Du kannst maximal die ersten 31 Spalten Deiner Eingabedatei verarbeiten.

wobei Column Nummer 1 ja der führende Eintrag ist, nachdem die ganze Zeile angewählt wird.
Ja, richtig. Deswegen hat der FINDSTR-Befehl in der Klammer des FOR-Befehls in Zeile 12 den Parameter /b, die Suche nach dem Rechnernamen wird dadurch auf den Zeilenanfang "festgenagelt".

Wenn ich dann die Einträge für "if defined Found" erweitern will, müsste ich dann auch die oberen "for /f %%A"-Einträge anpassen.
Ja, wenn die Spalten der Eingabedatei, so wie in Deinem Beispiel, mit einem Leerzeichen beginnen und enden.

Nun hast Du von oben nach unten ja %%a, %%c und %%b gesetzt. Hat diese Reihenfolge einen Hintergrund oder ist das egal und ich könnte dann in folgenden "For"-Schleifen mit %%d, %%e, %%f... weitermachen?
Die Reihenfolge ist egal. %%a entspricht der 2. Spalte der Eingabedatei, %%b der 3. Spalte, %%c der 4. Spalte. Die Subnetzmaske steht in Deinem Beispiel in Spalte 4, deshalb muss die Variable %SN% mit dem Inhalt der FOR-Laufvariablen %%c gefüllt werden. Deren Wert steht in der FOR-Laufvariablen %%A, allerdings um evtl. vorhandene Leerzeichen gekürzt. Wenn der Inhalt einer Spalte Deiner Eingabedatei Leerzeichen enthalten kann, wäre es am besten, beim Schreiben der Eingabedatei den Spalteninhalt nicht in Leerzeichen einzuschließen. Dann können die FOR-Schleifen in den Zeilen 14-16 entfallen und die Laufvariablen der äußeren FOR-Schleife direkt verarbeitet werden.

Gruß
Friemler
Member: Boory01
Boory01 Jun 16, 2015 at 04:48:33 (UTC)
Goto Top
Hallo Friemler,

ganz lieben Dank für Deine Unterstützung. ich werde heute (in der Arbeit) das Ganze mal komplett anpassen und auf Basis Deines "Schnipsels" mit meinen Daten "scharf" schalten, damit ich alles sauber testen kann. Bitte entschuldige meine Fragerei, ob und warum und wieso, aber es widerstrebt mir, einfach "irgendwas" von anderen herzunehmen, zu verbiegen und gut ist - ich verstehe auch gerne, WAS ich hier eigentlich tue und wie die Zusammenhänge sind. Endziel ist, so wenig wie möglich die Foren zu nerven und mehr selber zu wissen. ;)
In sofern warst Du mir eine große Hilfe und ich würde mich gerne melden, wenn ich alles nach meinen Bedürfnissen zusammengebaut habe und es (hoffentlich) so funktioniert, wie es geplant ist.

Nochmals DANKE und vorerst schon mal einen schönen Tag! face-smile

Boory
Member: Friemler
Solution Friemler Jun 16, 2015, updated at Jun 17, 2015 at 17:52:02 (UTC)
Goto Top
Hallo Boory01,

... es widerstrebt mir, einfach "irgendwas" von anderen herzunehmen, zu verbiegen und gut ist - ich verstehe auch gerne, WAS ich hier eigentlich tue und wie die Zusammenhänge sind.
Das ist die richtige Einstellung, denn selbst denken macht schlau. face-wink

... ich würde mich gerne melden, wenn ich alles nach meinen Bedürfnissen zusammengebaut habe und es (hoffentlich) so funktioniert, wie es geplant ist.
Kein Problem, kannst Du gerne tun.

Gruß
Friemler
Member: Boory01
Boory01 Jun 17, 2015 at 18:32:24 (UTC)
Goto Top
Hallo Friemler,

nochmals vielen Dank für Deine Hilfe! Durch Deinen "Schnipsel" bin ich in der Lage gewesen, alle benötigten Prozesse weitgehend zu automatisieren. Alle IP-Einträge, die ich bei knapp 80 Rechnern machen muß, kann ich nun automatisiert aus einer aus Excel exportierten Vorlagendatei auslesen. Es werden jetzt bei mir per Batch automatisch gesetzt: IP, GW, Subnet, DNS 1, 2 und Variablen, sowie Wins1 und 2. Das erspart mir viel Tipperei. Ich verarbeite das alles in einer größeren Batch mit Menü, über die auch User mit Autologon ein- und ausgetragen werden können und für die noch weitere Features geplant sind (Bildschirmschoner etc...)

Ich werde bei Bedarf auch gerne wieder auf die kompetente Hilfe hier im Forum zurückgreifen... face-smile

Nochmals vielen Dank und eine schöne restliche Woche noch!

Boory