cyberrico
Goto Top

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?

@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.

Content-Key: 206500

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

Printed on: April 25, 2024 at 08:04 o'clock

Member: Penny.Cilin
Penny.Cilin May 15, 2013 updated at 11:21:03 (UTC)
Goto Top
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
 setlocal ENABLEDELAYEDEXPANSION
setzen.


auch kein gruß

Penny
Member: Cyberrico
Cyberrico May 15, 2013 updated at 12:12:53 (UTC)
Goto Top
Danke für den Tipp, der hilft aber dennoch nicht weiter, da es nicht daran liegt. Quasi auch beim Ausblenden der :Again Marke und der Goto Funktion stimmt etwas mit den For Schleifen nicht.

Ich habe das funktionierende Skript beigefügt:

@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 ip=10.102.100.248
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
  	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:

@echo Testende am %DATE% um %TIME% >>%ausw%
exit
Member: hirnchen
hirnchen May 15, 2013 at 12:47:23 (UTC)
Goto Top
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
Member: Cyberrico
Cyberrico May 15, 2013 at 13:22:48 (UTC)
Goto Top
Hallo Hirnchen,

wie würde denn das genau aussehen?

LG

Cyberrico
Member: bastla
bastla May 15, 2013 at 13:47:30 (UTC)
Goto Top
Hallo Cyberrico und willkommen im Forum!

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
zu ersetzen (das Testen überlasse ich Dir face-wink) ...

Grüße
bastla
Member: Cyberrico
Cyberrico May 15, 2013 at 14:29:31 (UTC)
Goto Top
Hallo bastla!

Danke für die Top Antwort! Ich habe das Skript nun getestet und muss positives als auch negatives berichten.

Positiv: Es funktioniert, wenn ich die ABBRUCHANZAHL auf 1 stelle

Negativ: Sobald die ABBRUCHZAHL erhöht wird z.B.: auf 3 macht das Skript den Pingtest sofort mit Zeile 1 3 mal, danach Zeile 2 1 mal, danach Zeile 3 1 mal..... und dann bricht das Skript ab.

Ich hätte mir das so vorgestellt, dass er nach dem Setzen der ABBRUCHANZAHL auf die Zahl 3 zuerst einen kompletten Durchgang der iplist durchführt und erst danach mit einem 2. Durchgang startet und letztendlich den 3. Durchgang startet und dann erst abbricht.

LG
Cyberrico
Member: bastla
bastla May 15, 2013 updated at 14:55:15 (UTC)
Goto Top
Hallo Caberrico!

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
Grüße
bastla

[Edit] Startwert in Zeile 2 auf 1 gesetzt [/Edit]
Member: hirnchen
hirnchen May 15, 2013 at 14:46:18 (UTC)
Goto Top
Hallo bastla,

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
Member: bastla
bastla May 15, 2013 updated at 14:55:33 (UTC)
Goto Top
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
Member: Cyberrico
Cyberrico May 16, 2013 at 06:54:02 (UTC)
Goto Top
Danke euch beiden! Ihr habt mir sehr weitergeholfen.

LG
Cyberrico