FOR Schleife mit LOOP und nachfolgender FOR Schleife
Hallo zusammen,
ich habe ein Problem mit einem Batchfile.
Situation:
im Netzwerk ist kein WINS mehr vorhanden und so muss ich zwangsläufig auf die gute alte LMHOSTS ausweichen.
Da die IPs aber nicht statisch sind und ich keine Lust habe alles via cmd manuell zu machen habe ich ein Batch erstellt.
Aus einer Client_list.txt sollen die darin enthaltenen Client Namen ausgelesen und als Variable gesetzt werden.
Beispielinhalt der Client_list.txt
pc1
pc2
pc3
pc4
EOL
CODE:
:getclientname
FOR /L %%H IN (client_list.txt) DO (set clientname=%%H)
IF %%H==EOL goto:end
Jetzt wo die Variable definiert ist, soll im nächsten Schritt der Ping durchgeführt, die IP ausgelesen und in nachfolgend IP und Clientname in die LMHOSTS geschrieben werden.
:getip
ping.exe -n 1 -4 %clientname% >> temp.txt
FOR /F "tokens=2 delims=" %%G IN (temp.txt) DO @echo %%G %clientname% >> lmhosts
del temp.txt
goto:getclientname
Das Problem:
als Ergebnis bekomme ich nachher die gewünschte LMHOSTS (richtige Formatierung) aber sie enthält nur einen Eintrag. Und zwar die IP und den Rechnernamen des letzten gelisteten PCs aus der Client_list.txt. Wo liegt der Fehler das die Einträge nicht zeilenweise abgearbeitet werden?
Und ich bin mir fast sicher, dass ich bei der Schleifenbildung auch irgendwo Fehler drin habe.
Vielleicht kann ja jemand helfen
Gruß
Mike
ich habe ein Problem mit einem Batchfile.
Situation:
im Netzwerk ist kein WINS mehr vorhanden und so muss ich zwangsläufig auf die gute alte LMHOSTS ausweichen.
Da die IPs aber nicht statisch sind und ich keine Lust habe alles via cmd manuell zu machen habe ich ein Batch erstellt.
Aus einer Client_list.txt sollen die darin enthaltenen Client Namen ausgelesen und als Variable gesetzt werden.
Beispielinhalt der Client_list.txt
pc1
pc2
pc3
pc4
EOL
CODE:
:getclientname
FOR /L %%H IN (client_list.txt) DO (set clientname=%%H)
IF %%H==EOL goto:end
Jetzt wo die Variable definiert ist, soll im nächsten Schritt der Ping durchgeführt, die IP ausgelesen und in nachfolgend IP und Clientname in die LMHOSTS geschrieben werden.
:getip
ping.exe -n 1 -4 %clientname% >> temp.txt
FOR /F "tokens=2 delims=" %%G IN (temp.txt) DO @echo %%G %clientname% >> lmhosts
del temp.txt
goto:getclientname
Das Problem:
als Ergebnis bekomme ich nachher die gewünschte LMHOSTS (richtige Formatierung) aber sie enthält nur einen Eintrag. Und zwar die IP und den Rechnernamen des letzten gelisteten PCs aus der Client_list.txt. Wo liegt der Fehler das die Einträge nicht zeilenweise abgearbeitet werden?
Und ich bin mir fast sicher, dass ich bei der Schleifenbildung auch irgendwo Fehler drin habe.
Vielleicht kann ja jemand helfen
Gruß
Mike
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 308577
Url: https://administrator.de/contentid/308577
Ausgedruckt am: 22.11.2024 um 12:11 Uhr
6 Kommentare
Neuester Kommentar
Hallo Mike,
erstmal solltest du für deine 1. Schleife for /f statt /l verwenden. Soweit ich weiß benutzt man for /l nur zum erstellen von Folgen.
Dein Problem liegt aber viel eher darin, dass deine Befehle nicht in der 1. Schleife abgearbeitet werden. Deine "eigtl. übergeordnete" Schleife endet bei dir nach dieser Zeile (durch die schließende Klammer):
Auch die folgende IF Bedingung wird erst nach Abschluss der Schleife betrachtet. Insofern speichert die Schleife jeden Wert der Input Datei in die Variable, aber dein Skript führt keine weiteren Befehle damit aus. Lediglich der letzte Eintrag der Txt wird somit verarbeitet. Du musst die Klammer geöffnet lassen und die weiteren Befehle in die For-Schleife integrieren. Z.B.
Ich hoffe das hilft dir schon weiter.
Gruß,
narthan
erstmal solltest du für deine 1. Schleife for /f statt /l verwenden. Soweit ich weiß benutzt man for /l nur zum erstellen von Folgen.
Dein Problem liegt aber viel eher darin, dass deine Befehle nicht in der 1. Schleife abgearbeitet werden. Deine "eigtl. übergeordnete" Schleife endet bei dir nach dieser Zeile (durch die schließende Klammer):
FOR /L %%H IN (client_list.txt) DO (set clientname=%%H)
Auch die folgende IF Bedingung wird erst nach Abschluss der Schleife betrachtet. Insofern speichert die Schleife jeden Wert der Input Datei in die Variable, aber dein Skript führt keine weiteren Befehle damit aus. Lediglich der letzte Eintrag der Txt wird somit verarbeitet. Du musst die Klammer geöffnet lassen und die weiteren Befehle in die For-Schleife integrieren. Z.B.
....
FOR /F %%h IN (client_list.txt) DO (
SET "clientname=%%h"
IF "%%h"=="EOL" (
GOTO :EOF
) ELSE (
ping.exe ..... :: usw. hier weitere Bearbeitung
)
)
Ich hoffe das hilft dir schon weiter.
Gruß,
narthan
Moin miczar,
etwas verkürzt ungetestet so:
Ein Problem bei deinem Code:
Mehrfach ausgeführt nach einer FOR-Anweisung wird das, was innerhalb der Klammern nach dem "DO" steht.
Dort steht bei dir oben in der ersten FOR-Anweisung nur.
Grüße
Biber
etwas verkürzt ungetestet so:
FOR /F %%i IN (client_list.txt) DO (
IF "%%i" NEQ"EOL" (
FOR /F "tokens=2 delims=" %%G IN ('ping.exe -n 1 -4 %%i') DO @echo %%G %%i >> lmhosts
) )
Ein Problem bei deinem Code:
Mehrfach ausgeführt nach einer FOR-Anweisung wird das, was innerhalb der Klammern nach dem "DO" steht.
Dort steht bei dir oben in der ersten FOR-Anweisung nur.
set clientname=%%H
.Grüße
Biber
Hallo Mike,
zuerst musst du im Falle der verschachtelten Schleife die "verzögerte Erweiterung von Umgebungsvariablen" mittels
aktivieren. Infolgedessen musst du nach Deklaration der Variable clientnamedurch
die Variable mittels Ausrufezeichen verwenden, da es sich hier um eine verzögerte Erweiterung handelt. Falls du dich weiter in das Thema einlesen möchtest, gibt dazu einige Posts hier im Forum. Über die Internetsuche solltest du auch andere Seiten zu dem Thema finden. )
Falls du noch weitere Fragen/Probleme hast - nur zu...
Wenn du meinen Code verwenden möchtest anstelle des schöneren von Biber, kann ich dir den fertigen Code posten. Ich habe ihn bereits mit Bsp. Dateien getestet und er funktioniert.
Gruß,
narthan
zuerst musst du im Falle der verschachtelten Schleife die "verzögerte Erweiterung von Umgebungsvariablen" mittels
SETLOCAL EnableDelayedExpansion
aktivieren. Infolgedessen musst du nach Deklaration der Variable clientnamedurch
SET "clientname=%%h"
die Variable mittels Ausrufezeichen verwenden, da es sich hier um eine verzögerte Erweiterung handelt. Falls du dich weiter in das Thema einlesen möchtest, gibt dazu einige Posts hier im Forum. Über die Internetsuche solltest du auch andere Seiten zu dem Thema finden. )
...(
ping -n 1 -4 !clientname!>> temp.txt
...
...DO @echo %%g !clientname!>> lmhosts.txt
...
Falls du noch weitere Fragen/Probleme hast - nur zu...
Wenn du meinen Code verwenden möchtest anstelle des schöneren von Biber, kann ich dir den fertigen Code posten. Ich habe ihn bereits mit Bsp. Dateien getestet und er funktioniert.
Gruß,
narthan