Probleme mit verschachtelter For Schleife
Hallo an alle!
Ich möchte mit diesem Skript mehrere IP Adressen pingen. Derzeit funktioniert das Skript mit einer IP Adresse einwandfrei. Beim Einlesen der IP Adressenliste (ipadressen1.txt, jede IP Adresse steht in einer Zeile) funktioniert die darüber gelegte for Schleife nicht mehr. Kann mir da jemand weiterhelfen?
Danke für eure Hilfe.
Ich möchte mit diesem Skript mehrere IP Adressen pingen. Derzeit funktioniert das Skript mit einer IP Adresse einwandfrei. Beim Einlesen der IP Adressenliste (ipadressen1.txt, jede IP Adresse steht in einer Zeile) funktioniert die darüber gelegte for Schleife nicht mehr. Kann mir da jemand weiterhelfen?
@echo off
setlocal ENABLEDELAYEDEXPANSION
set jahr=%date:~-4%
set monat=%date:~-7,2%
set tag=%date:~-10,2%
set stunden=%Time:~-11,2%
set minuten=%Time:~-8,2%
set sekunden=%Time:~-5,2%
set log=status_%tag%.%monat%.%jahr%.txt
set ausw=auswertung_%tag%.%monat%.%jahr%.txt
set iplist=ipadressen1.txt
Set "MIN_MAX_AVG=Offline"
set count=1
set Wiederholungen=4
set Zeitlimit=2000
set Groesse=2000
set ABBRUCHNANZAHL=3
@echo Testbeginn am %DATE% um %TIME% >>%ausw%
:Again
rem wäre ganz toll, wenn das so ähnlich funktionieren würde....
rem for /f %%f in (%iplist%) do (set ip=%%f && echo %%f
echo ...bisher %count% Ping-Tests mit %ip%
Ping %ip% -n %Wiederholungen% -w %Zeitlimit% -l %Groesse% >>%log%
for /F "delims==, skip=2 tokens=2,4,6" %%i in ('find "Pakete" %log%') do (Set "SEND_RECV_LOST=Gesendet:%%i - Empfangen:%%j - Verloren:%%k" && Set "LOSTs=%%k")
for /F "delims==, skip=2 tokens=2,4,6" %%i in ('find "Minimum" %log%') do (if %LOSTs% == %Wiederholungen% (Set "MIN_MAX_AVG=Offline") else (Set "MIN_MAX_AVG=Online - Minimum:%%i - Maximum:%%j - Mittelwert:%%k"))
echo %date% - %time% - %ip% - %SEND_RECV_LOST% - %MIN_MAX_AVG% >>%ausw%
set /a count=count+1
IF %count% LEQ %ABBRUCHNANZAHL% Goto Again:
rem )
@echo Testende am %DATE% um %TIME% >>%ausw%
exit
Danke für eure Hilfe.
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 206500
Url: https://administrator.de/forum/probleme-mit-verschachtelter-for-schleife-206500.html
Ausgedruckt am: 23.04.2025 um 04:04 Uhr
10 Kommentare
Neuester Kommentar
Keine Begrüssung.
Das erste was mir auffällt, ist daß Du ein GoTo innerhalb einer FOR Schleife hast, welche aus der FOR-Schleife rausspringt.
Schau Dir mal das Tutorial zur FOR-Schleife an.
Zudem würde ich u.U. ein setzen.
auch kein gruß
Penny
Das erste was mir auffällt, ist daß Du ein GoTo innerhalb einer FOR Schleife hast, welche aus der FOR-Schleife rausspringt.
Schau Dir mal das Tutorial zur FOR-Schleife an.
Zudem würde ich u.U. ein
setlocal ENABLEDELAYEDEXPANSION
auch kein gruß
Penny
Hallo Cyberrico,
So wie das Script dort steht, also mit einzelner IP wird es auch funktionieren.
Das Problem was ich in der Version aus dem ersten Beitrag sehe ist, dass du nicht einfach aus der ersten For Schleife springen kannst ohne die Logik der Auswertung zu verändern. Da gibt es zum Beispiel die variable count die einfach munter weiterzählt weil du ja aus der Schleife springst und dann wird die Schleife erneut VON VORNE gestartet, was ja mit sicherheit nicht gewollt ist.
Die einzige möglichkeit die ich in diesem Fall sehe ist, dass du zu erst alle IP Adressen in dynamische Variablen speicherst und dann anstatt mit der ersten for schleife mit einer Sprungmarke arbeitest, die auch variablen entgegen nehmen kann.
Gruss
hirnchen
So wie das Script dort steht, also mit einzelner IP wird es auch funktionieren.
Das Problem was ich in der Version aus dem ersten Beitrag sehe ist, dass du nicht einfach aus der ersten For Schleife springen kannst ohne die Logik der Auswertung zu verändern. Da gibt es zum Beispiel die variable count die einfach munter weiterzählt weil du ja aus der Schleife springst und dann wird die Schleife erneut VON VORNE gestartet, was ja mit sicherheit nicht gewollt ist.
Die einzige möglichkeit die ich in diesem Fall sehe ist, dass du zu erst alle IP Adressen in dynamische Variablen speicherst und dann anstatt mit der ersten for schleife mit einer Sprungmarke arbeitest, die auch variablen entgegen nehmen kann.
Gruss
hirnchen
Hallo Cyberrico und willkommen im Forum!
Wenn der gepostete Batch funktioniert sollte es genügen, den Teil ab Zeile 22 durch
zu ersetzen (das Testen überlasse ich Dir
) ...
Grüße
bastla
Wenn der gepostete Batch funktioniert sollte es genügen, den Teil ab Zeile 22 durch
echo Testbeginn am %DATE% um %TIME% >>%ausw%
for /f %%i in (iplist) do call :ProcessIP %%i
echo Testende am %DATE% um %TIME% >>%ausw%
goto :eof
:ProcessIP
echo ...bisher %count% Ping-Tests mit %1
Ping %1 -n %Wiederholungen% -w %Zeitlimit% -l %Groesse% >>%log%
for /F "delims==, skip=2 tokens=2,4,6" %%i in ('find "Pakete" %log%') do (Set "SEND_RECV_LOST=Gesendet:%%i - Empfangen:%%j - Verloren:%%k" && Set "LOSTs=%%k")
for /F "delims==, skip=2 tokens=2,4,6" %%i in ('find "Minimum" %log%') do (if %LOSTs% == %Wiederholungen% (Set "MIN_MAX_AVG=Offline") else (Set "MIN_MAX_AVG=Online - Minimum:%%i - Maximum:%%j - Mittelwert:%%k"))
echo %date% - %time% - %1 - %SEND_RECV_LOST% - %MIN_MAX_AVG% >>%ausw%
set /a count+=1
IF %count% LEQ %ABBRUCHNANZAHL% Goto :ProcessIP
goto :eof
Grüße
bastla
Hallo Caberrico!
Dann wohl eher so:
Grüße
bastla
[Edit] Startwert in Zeile 2 auf 1 gesetzt [/Edit]
Dann wohl eher so:
echo Testbeginn am %DATE% um %TIME% >>%ausw%
set /a count=1
:Again
for /f %%i in (iplist) do call :ProcessIP %%i
set /a count+=1
IF %count% LEQ %ABBRUCHNANZAHL% Goto :Again
echo Testende am %DATE% um %TIME% >>%ausw%
goto :eof
:ProcessIP
echo ...bisher %count% Ping-Tests mit %1
Ping %1 -n %Wiederholungen% -w %Zeitlimit% -l %Groesse% >>%log%
for /F "delims==, skip=2 tokens=2,4,6" %%i in ('find "Pakete" %log%') do (Set "SEND_RECV_LOST=Gesendet:%%i - Empfangen:%%j - Verloren:%%k" && Set "LOSTs=%%k")
for /F "delims==, skip=2 tokens=2,4,6" %%i in ('find "Minimum" %log%') do (if %LOSTs% == %Wiederholungen% (Set "MIN_MAX_AVG=Offline") else (Set "MIN_MAX_AVG=Online - Minimum:%%i - Maximum:%%j - Mittelwert:%%k"))
echo %date% - %time% - %1 - %SEND_RECV_LOST% - %MIN_MAX_AVG% >>%ausw%
goto :eof
bastla
[Edit] Startwert in Zeile 2 auf 1 gesetzt [/Edit]
Hallo bastla,
ich denke so sollte es noch eher funktionieren:
Gruss
hirnchen
ich denke so sollte es noch eher funktionieren:
echo Testbeginn am %DATE% um %TIME% >>%ausw%
set /a count=1
:Again
for /f %%i in (%iplist%) do call :ProcessIP %%i
IF %count% LEQ %ABBRUCHNANZAHL% Goto :Again
echo Testende am %DATE% um %TIME% >>%ausw%
goto :eof
:ProcessIP
echo ...bisher %count% Ping-Tests mit %1
Ping %1 -n %Wiederholungen% -w %Zeitlimit% -l %Groesse% >>%log%
for /F "delims==, skip=2 tokens=2,4,6" %%i in ('find "Pakete" %log%') do (Set "SEND_RECV_LOST=Gesendet:%%i - Empfangen:%%j - Verloren:%%k" && Set "LOSTs=%%k")
for /F "delims==, skip=2 tokens=2,4,6" %%i in ('find "Minimum" %log%') do (if %LOSTs% == %Wiederholungen% (Set "MIN_MAX_AVG=Offline") else (Set "MIN_MAX_AVG=Online - Minimum:%%i - Maximum:%%j - Mittelwert:%%k"))
echo %date% - %time% - %1 - %SEND_RECV_LOST% - %MIN_MAX_AVG% >>%ausw%
set /a count+=1
goto :eof
Gruss
hirnchen
Hallo hirnchen (und BTW: Willkommen im Forum)!
Ich hatte das so verstanden, dass die gesamte Liste dreimal abgearbeitet werden soll - bei Deinem Ansatz werden aber die getesteten Adressen gezählt ...
Hinsichtilch des Startwertes 1 für den Zähler hast du allerdings recht (korrigiere ich gleich oben) ...
Grüße
bastla
Ich hatte das so verstanden, dass die gesamte Liste dreimal abgearbeitet werden soll - bei Deinem Ansatz werden aber die getesteten Adressen gezählt ...
Hinsichtilch des Startwertes 1 für den Zähler hast du allerdings recht (korrigiere ich gleich oben) ...
Grüße
bastla