kkboy94
Goto Top

For-Schleife Fortlaufende Variablen

Ich habe schon in anderen Threads nachgesehen, Dr. Google bemüht, aber entweder hab ich nicht die richtigen Suchworte gefunden oder es sind nicht die passenden Probleme aufgetreten.

So nun aber zu meinem Problem:
rem Es wird als erstes eine Variable durch die Benutzereingabe gesetzt.
set /p Zahlen=Ziffern eingeben (durch Komma getrennt. Es werden nur die ersten 4 zeichen beruecksichtigt) (Bsp.:44,88,468,421):
rem Nun wird diese Variable in einer For /f Konstruktion weiterverwertet und wieder getrennt.
for /f "tokens=1-4 delims=,"  %%a in ("%Zahlen%") do  call :test %%a %%b %%c %%d  

rem Jetzt werden die einzelnen Parameter in Variablen gesetzt und angezeigt 
:test
set var1=%:~1
set var1=%:~2
set var1=%:~3
set var1=%:~4
echo %var1% %var2% %var3% %var4%
pause
Ist es möglich diese ganze Konstruktion ohne Parameter, -vielleicht mit einer zweiten for-Schleife-, zu schreiben?

Danke für alle Tipps die ich bekomme

MfG Karsten

Content-ID: 146246

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

Ausgedruckt am: 22.11.2024 um 13:11 Uhr

bastla
bastla 05.07.2010 um 15:10:38 Uhr
Goto Top
Hallo Karsten!

Soferne nicht (viel) mehr als das Anzeigen passieren soll, würde ja natürlich die direkte Verwendung der Schleifenvariablen, etwa in der Art:
for /f "tokens=1-4 delims=,"  %%a in ("%Zahlen%") do  echo %%a %%b %%c %%d 
als Zeile 4 genügen ...

... aber was mit "ohne Parameter" gemeint ist, kann ich mir jetzt nicht so richtig vorstellen ...

Was ist denn letztlich der Endzweck der ganzen Aktion?

Grüße
bastla
kkboy94
kkboy94 05.07.2010 um 15:55:59 Uhr
Goto Top
Zitat von @bastla:

... aber was mit "ohne Parameter" gemeint ist, kann ich mir jetzt nicht so richtig vorstellen ...
Damit meine ich den "Call"Befehl. Unter test sollte dann halt das gemacht werden, was du sicher auch noch lesen wirst^^

Was ist denn letztlich der Endzweck der ganzen Aktion?
Eigentlich, dass ich was lerne, aber in diesem Fall speziell soll dann für jede Zahl ein ping Befehl ausgeführt werden. Die Zahlen stellen jeweils den letzten Block der IP-Adresse an.


Und wenn wir schon dabei sind:
Kann man die Variable %Zahlen% so überprüfen, dass keine Zahl über 254 liegt?


Grüße
zurück
sanixo
sanixo 05.07.2010 um 15:56:34 Uhr
Goto Top
Hallo Karsten,

würde es nicht ausreichen, die SET Befehle gleich hinter der FOR-Schleife auszuführen?

for /f "tokens=1-4 delims=,"  %%a in ("%Zahlen%") do (SET var1=%%a & SET var2=%%b & SET var3=%%c & SET var4=%%d)  

Gruß, Dennis
kkboy94
kkboy94 05.07.2010 um 15:57:52 Uhr
Goto Top
Hmm Danke, war mein Internet wieder etwas langsam, deshalb:
Siehe oben
bastla
bastla 05.07.2010 um 16:02:44 Uhr
Goto Top
Hallo Karsten!

Natürlich kannst Du die "for"-Schleife auch so schreiben:
for /f "tokens=1-4 delims=,"  %%a in ("%Zahlen%") do  (  
    echo %%a %%b %%c %%d
    if %%a leq 254 if %%b leq 254 if %%c leq 254 if %%d leq 254 ping %%a.%%b.%%c.%%d
)
Solange alles innerhalb des "do" (auch wenn es, wie in diesem Beispiel, über mehrere Zeilen verteilt ist) abgehandelt wird, brauchst Du eigentlich keine Zuweisung an andere Variablen vorzunehmen ...

Grüße
bastla
77559
77559 05.07.2010 um 17:30:01 Uhr
Goto Top
Hallo kkboy,

in obigem Fall arbeitest Du am Besten ohne For-Schleife, sondern übergibst die Eingabe direkt an die Subroutine (die ist bei deinem Batch übrigends NICHT vom Hauptteil mit einem notwendigen Goto :Eof getrennt)

Der Call trennt die Argumente per Default an Leerzeichen Komma Semikolon und Tab.
Wenn du jetzt noch shift benutzt, kannst du eine beliebige Anzahl von Argumenten (nur durch die max Zeilenlänge begrenzt) verarbeiten.

Der Set /A mit "&"=binärem AND behält von der Zahl nur die untersten 8 Bit (0-255)
Wenn die Zahl davon abweicht, war es eine Fehleingabe.

@Echo off&SetLocal
set /p Zahlen=Ziffern eingeben (durch Komma getrennt. Es werden nur die ersten 4 zeichen beruecksichtigt) (Bsp.:44,88,468,421):
Call :test %Zahlen%
Goto :Eof
:test
If "%~1" EQU "" goto :Eof  
set /A "var=%~1 & 255"  
If "%var%" EQU "%~1" (  
  Echo Ping  -n 1  x.y.z.%1
) Else (
  Echo ungültiges Octet %1  
) 
Shift
Goto :test

Gruß
LotPings
kkboy94
kkboy94 05.07.2010 um 19:30:18 Uhr
Goto Top
Danke an bastla und sanixo, für eure Vorschläge

Funktioniert einwandfrei deine Lösung, mal abgesehen, von dem "Echo" vor dem Ping.
Ich hab jetzt alles etwas verändert und wollte dann direkt noch den hostnamen mit reinbringen:
@Echo off & SetLocal
echo.
set /p ipa=IP-Adresse eingeben (Bsp.:192.168.2): 
echo.
echo Bitte Den letzten Block der IP eingeben (durch Komma getrennt)
echo Keine der Zahlen darf gr%oe%%ss%er als 254 sein --^> Bsp.: 44,68,241,55
set /p Zahlen=Zahlen nun eingeben: 
Call :test %Zahlen%

Goto :Eof
:test
If "%~1" EQU "" goto :Eof  
set /A "var=%~1 & 255"  
If "%var%" EQU "%~1" (  
Ping  -n 1  %ipa%.%1|find "TTL"  
pause
for /f "tokens=2 delims= " %%A in ('ping -a %ipa%.%1 -n 1^|FIND "[%ipa%.%1]"') do (  
echo Die IP von "%%A" ist "%ipa%%1")  

) Else (
  Echo ungültiges Octet %1  
) 

Shift
pause
Goto :test

:::::::::::::::::::::::::::::::::::::

@Echo off&SetLocal
 >> %log%

Nur Zeile 17/18 funktioniert nicht so richtig.
Kann mir da noch jemand helfen.

MfG Karsten
77559
77559 05.07.2010 um 19:47:11 Uhr
Goto Top
Hallo Karsten,

ich will mich ja nicht mit fremden Federn schmücken, aber meine eigenen möchte ich schon noch behalten dürfen face-wink

In Zeile 17 ist hinten eine öffnende Klammer zu viel, verschiebe statt dessen den Inhalt von Z18 dahin.

Gruß
LotPings
kkboy94
kkboy94 05.07.2010 um 19:55:19 Uhr
Goto Top
Ja ist schon klar, ich hab ja auch nur geringfügige Sachen verändert, (x.y.z. durch %ipa% ausgetauscht ; Das 'find "TTL"' hinter "Ping" gesetzt und "Echo" vor "Ping" gelöscht ; Den Text für die Variable %Zahlen% geändert)


In meiner Batch hab ich das auch so wie mir geheißen face-wink , aber hier passte das nicht alles in eine Zeile. Und außerdem schließ die Klammer doch Ende Zeile 18 wieder.


MfG Karsten