zendara
Goto Top

Veränderbare Variable als Sprunkmarke nutzen

Hallo,

ich möchte eine Variable als Sprungmarke benutzen, damit ich ein Batchfile verkürzen kann.

Als erstes mal den Batch der Funktionier aber zu lange ist.

@echo off

set sprung=1
set alt=0

:start
if %sprung%==1 call :1
if %sprung%==2 call :2
if %sprung%==3 call :3
if %sprung%==4 call :4
if %sprung%==5 call :5
if %sprung%==6 goto fertig
goto exit

:1
	echo - Start 1
set alt=%sprung%
	echo Sprung ist jetzt: %Sprung%
set /a sprung=%sprung%+1
	echo %alt%+1=%sprung%
ping localhost -n 2 >nul
goto start

:2
	echo - Start 2
set alt=%sprung%
	echo Sprung ist jetzt: %Sprung%
set /a sprung=%sprung%+1
	echo %alt%+1=%sprung%
ping localhost -n 2 >nul
goto start

:3
	echo - Start 3
set alt=%sprung%
	echo Sprung ist jetzt: %Sprung%
set /a sprung=%sprung%+1
	echo %alt%+1=%sprung%
ping localhost -n 2 >nul
goto start

:4
	echo - Start 4
set alt=%sprung%
	echo Sprung ist jetzt: %Sprung%
set /a sprung=%sprung%+1
	echo %alt%+1=%sprung%
ping localhost -n 2 >nul
goto start

:5
	echo - Start 5
set alt=%sprung%
	echo Sprung ist jetzt: %Sprung%
set /a sprung=%sprung%+1
	echo %alt%+1=%sprung%
ping localhost -n 2 >nul
goto start

:exit
pause
exit

:fertig
	echo ==========
	echo  Fertig
	echo ==========
ping localhost -n 5 >nul
goto exit

Nun habe ich das File abgekürzt...

@echo off

set sprung=1
set alt=1

:start
if %sprung%==6 goto fertig
if %sprung%==%sprung% call :%sprung%
goto exit

rem Diese Einstiegspunkte möchte ich mir ersparen. Ab hier bis...
:1
:2
:3
:4
:5
rem ...bis hier.

rem hier will ich rein springen bzw. mit call aufrufen
:%sprung%
	echo - Start %sprung%
set alt=%sprung%
	echo Sprung ist jetzt: %Sprung%
set /a sprung=%sprung%+1
	echo %alt%+1=%sprung%
ping localhost -n 2 >nul
goto start

:exit
pause
exit

:fertig
	echo ==========
	echo  Fertig
	echo ==========
ping localhost -n 5 >nul
goto exit

Leider Funktioniert der Sprung zu :%sprung% nicht und ich muss immer :1, :2, :3,... vorher schreiben damit das File seinen Weg findet.
Die Ausgabe von %sprung% ist zwar richtig aber er kann scheinbar auf keine Variable springen.

Hat jemand eine Idee wie ich das lösen kann?
Ich hab auch ihr im Forum ähnliche Beiträge gefunden die mich aber nicht weiter brachten face-sad

Danke
Lg
Zendara

Content-ID: 224153

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

Ausgedruckt am: 22.11.2024 um 11:11 Uhr

bastla
Lösung bastla 10.12.2013 aktualisiert um 16:10:39 Uhr
Goto Top
Hallo Zendara!

Als Sprungmarke ":%sprung%" zu verwenden wird sich nicht realisieren lassen - es sollte aber auch überhaupt nicht nötig sein, wenn offensichtlich im Unterprogramm ohnehin immer das Gleiche passieren soll ...

Du kannst dazu eine festen Namen (etwa ":Unterprogramm") verwenden und dann immer dieses Label als Ziel des "call" angeben (die Variable %sprung% hast Du ja im Unterprogramm zur Verfügung) bzw, je nachdem, was Du tatsächlich vorhast, auch einfach eine "for /L"-Schleife verwenden.

Grüße
bastla
Zendara
Zendara 10.12.2013 um 16:13:38 Uhr
Goto Top
Hallo Bastla,

danke für deine Antwort das hat mir schon mal sehr weitergeholfen.
Ich hab jetzt zwar noch ein paar Probleme in dem Batchfile welches mit der Frage zutun hat, aber ich muss noch das eigentliche Problem eingrenzen.

Lg
Zendara
Zendara
Zendara 10.12.2013 um 17:39:25 Uhr
Goto Top
Ich Bin mir jetzt nicht mal sicher ob diese Batch Datei zu dem von mir erstellten Thema passt, aber vielleicht hat es ja mit dem von dir angesprochenen For /L zu tun.

@echo off
cls
title Netzwerk Serverabfrage @Firma

if exist Verbindungsfehler.log del Verbindungsfehler.log

set IP1=www.google.at& 		set Aufloesung1=www.google.at
set IP2=192.168.0.2& 		set Aufloesung2=Rechner1
set IP3=192.168.0.3& 		set Aufloesung3=Rechner2
set IP4=192.168.0.6& 		set Aufloesung4=Rechner3
set IP5=192.168.0.7& 		set Aufloesung5=Rechner4
set IP6=192.168.0.19& 		set Aufloesung6=Rechner5
set IP7=192.168.0.21& 		set Aufloesung7=Rechner6
set IP8=192.168.0.12& 		set Aufloesung8=Rechner7
set IP9=192.168.0.13& 		set Aufloesung9=Rechner8
set IP10=192.168.0.14& 		set Aufloesung10=Rechner9
set IP11=192.168.0.15& 		set Aufloesung11=Rechner10
set IP12=192.168.0.16& 		set Aufloesung12=Rechner11
set IP13=192.168.0.20& 		set Aufloesung13=Rechner12
set IP14=192.168.0.128& 	set Aufloesung14=Rechner13
set IP15=192.168.8.1& 		set Aufloesung15=Rechner14
set IP16=192.168.8.2& 		set Aufloesung16=Rechner15
set IP17=192.168.8.3& 		set Aufloesung17=Rechner16
set IP18=192.168.8.4& 		set Aufloesung18=Rechner17
set IP19=192.168.8.5& 		set Aufloesung19=Rechner18
set IP20=172.123.123.123& 	set Aufloesung20=Rechner19
cls
goto start

:start
set next=0
set AktionEnde=0
goto Vorbereitung

:Vorbereitung
rem --------------- Hier ist der Fehler ---------------
set /a AktionEnde=%AktionEnde%+1
	echo ------------- %AktionEnde%
set /a next=%next%+1
	echo ------------- %next%
set Aufloesung=Aufloesung%next%
	echo ------------- %Aufloesung%
set Ziel=IP%next%
	echo ------------- %Ziel%
::set Ziel=%IP1%
goto Aktion

:Aktion
goto Anzeige

:Anzeige
	echo.
	echo ========================
rem --------------- %Aufloesung% hat zwar den Wert Aufloesung1 aber dieser Wert kann nicht auf www.google.at verweisen ---------------
	echo  Ping auf %Aufloesung%
	echo ========================
goto Aktion2

:Aktion2
rem --------------- %ziel% hat zwar den Wert zB. IP1 aber dieser Wert kann nicht auf www.google.at verweisen ---------------
ping %ziel% -n 2 | find "TTL="  
::ping %IP1%
::ping %ziel%
set elevel=%Errorlevel%
	echo ------------- %elevel%
if %elevel%==0 echo OK
if %elevel%==0 goto Vorbereitung
if %elevel%==1 echo Keiner Verbindung zu %Aufloesung%!
if %elevel%==1 goto Fehler
goto falscherEL

:falscherEL
	echo Errorlevel von Ping ist nicht falsch! %elevel%
pause
goto exit

:ende
	echo.
	echo Verbindungstest durchgefuehrt
	echo.
start Verbindungsfehler.log
goto exit

:Fehler
	echo %date% %time% Keine Verbindung zu %Aufloesung% %Ziel% >>Verbindungsfehler.log
goto box
	
:box
	echo msgbox"Fehlerhafte Verbindung zu %Aufloesung% %Ziel%. Zeitueberschreitung der Anforderung! Errorlevel = %elevel%",0,"Verbindungsfehler" >%Ziel%.vbs   
ping localhost -n 3 -w 1000 >NUL
start %Ziel%.vbs
ping %Ziel% -n 4
del %Ziel%.vbs
goto %next%

:exit
	echo EXIT
pause
exit

Den Bereich wo der Fehler entsteht ( damit meine ist jetzt nicht den Inhalt des Sessels der vor meinem PC steht) habe ich mit rem makeirt.
Ich will in einer Variable wieder den Nummernteil ändern was mit Echo angezeigt wird aber die Variable unbrachbar macht.

lg
Zendara
Endoro
Endoro 10.12.2013 um 20:53:52 Uhr
Goto Top
Hey, warum sollte eine konstante Zeichenkette mit einer Variablen eine neue Variable ergeben und wie sollte der Interpreter das erkennen? Ich gebe aber zu, dass sich deine Lösung iwie aufdrängt, ich seh' sie bestimmt 2x/Woche face-smile
@ECHO OFF &SETLOCAL
set "IP1=www.google.at"  
set "Aufloesung1=www.google.at"  
set /a next=0
set /a AktionEnde=0
rem --------------- Hier war der Fehler ---------------
set /a AktionEnde+=1
	echo ------------- %AktionEnde%
set /a next+=1
	echo ------------- %next%
call set "Aufloesung=%%Aufloesung%next%%%"  
	echo ------------- %Aufloesung%
call set "Ziel=%%IP%next%%%"  
	echo ------------- %Ziel%
Es gibt noch andere Wege, über Forschleifen und delayed expansion.
lg.
bastla
bastla 10.12.2013 aktualisiert um 21:21:30 Uhr
Goto Top
Hallo Zendara & Endoro!

Es stellt sich ohnehin die Frage, wozu dieses Pseudo-Array gut sein soll - das ließe sich doch zB auch mit einer Liste in einer Textdatei oder auch im Batch selbst - also (vereinfacht) etwa mit
@echo off & setlocal
cls
title Netzwerk Serverabfrage @Firma

REM DATA	www.google.at	www.google.at
REM DATA	192.168.0.2	Rechner1
REM DATA	192.168.0.3	Rechner2
REM DATA	192.168.0.6	Rechner3

set "Log=Verbindungsfehler.log"  
set "box=%temp%\box.vbs"  

if exist "%Log%" del "%Log%"  
>"%box%" echo Set a=WScript.Arguments: Msgbox "Fehlerhafte Verbindung zu "^&a(0)^&" "^&a(1)^&". Zeitueberschreitung der Anforderung!",0,"Verbindungsfehler"  

for /f "tokens=3,4" %%a in ('findstr /bc:"REM DATA" "%~0"') do (  
    echo.
    echo ========================
    echo  Ping auf %%b
    echo ========================
    ping %%a -n 2 | find "TTL=" && (  
        echo OK
    ) || (
        echo Keine Verbindung zu %%b!
        >>Verbindungsfehler.log echo %date% %time% Keine Verbindung zu %%b %%a
        start %box% %%b %%a
        ping localhost -n 3 -w 1000 >NUL
    )
)
echo.
echo Verbindungstest durchgefuehrt
echo.
if exist "%Log%" start notepad "%Log%"  
lösen ...

Grüße
bastla
Endoro
Endoro 10.12.2013 um 21:34:44 Uhr
Goto Top
Zitat von @bastla:
Es stellt sich ohnehin die Frage, wozu dieses Pseudo-Array gut sein soll
Mmm, ich muss die immer verteidigen, diese assoziativen Arrays. Dadurch wird Batch erst richtig schön face-smile
lg.
bastla
bastla 10.12.2013 um 21:40:39 Uhr
Goto Top
Hallo Endoro!

Lass ich mir noch einreden, wenn ich den Index nachträglich für eine Auswahl (zB aus einer dynamisch erstellten Dateiliste) verwenden will - aber hier? face-confused

Grüße
bastla
Zendara
Zendara 11.12.2013 um 15:22:55 Uhr
Goto Top
Hallo,

danke euch für die Antworten und Beispiele.
Ich bin gerade dabei mich durch den von euch empfolenen Befehl For zu lesen.
Bis jetzt kann ich aber nur raten was da passiert.

for /f "tokens=3,4" %%a in ('findstr /bc:"REM DATA" "%~0"') do ( ....

Es werden die Werte aus REM DATA geladen wobei mit token 3,4 auf IP und Namen verwiesen wird.
%%a ist die Variable von IP, %%b von Name.
findstr durchsucht das aktuelle File vom Zeichenanfang nach einer bestimmten Zeichenfolge, aus %~0 kann ich mir keinen Reim machen.

Ich hab jetzt einfach mal ganz frech das umgeschriebene Batchfile übernommen. Der Ping läuft durch und öffnet danach auch das Text File mit den nicht erreichbaren PC´s. Das Fenster kommt auch sobald ein Client nicht erreichbar ist

ping %%a -n 2 | find "TTL=" && (...

Warum die Ergänzung mit >nul beim ping nicht geht verstehe ich nicht. Benötigt "find" die Ausgabe?

Auf jedenfall Danke euch für die Mühe, ich kenn jetzt meinen Batch nicht mehr ;)

Lg
Zendara
bastla
bastla 11.12.2013 um 17:02:05 Uhr
Goto Top
Hallo Zendara!
Bis jetzt kann ich aber nur raten was da passiert.
Gut geraten. face-smile
aus %~0 kann ich mir keinen Reim machen.
Das ist die Batchdatei selbst ("findstr" sucht nicht automatisch in der aktuellen Datei und benötigt daher diese Information).
Warum die Ergänzung mit >nul beim ping nicht geht verstehe ich nicht. Benötigt "find" die Ausgabe?
Letzteres natürlich - allerdings sollte
ping %%a -n 2 | find "TTL=" >nul && (
die unerwünschten Ausgaben verschwinden lassen ...

Grüße
bastla
Zendara
Zendara 11.12.2013 um 17:10:38 Uhr
Goto Top
Super Danke face-smile