ripued

Batch-Datei bei Sprungmarke innerhalb Batch aufrufen

Hallo,

da ich für ein längeres Skript teilweise auf eine andere Batch-Dateien wechseln muss, würde ich gerne wissen, wie man das genau bewerkstelligen kann.
Leider scheint mir der call-Befehl nicht weiterzuhelfen, da die andere Datei viel Code enthält und deshalb müsste diese bei einer gewissen Sprungmarke fortgesetzt werden.

Wie könnte ich das am besten tun? Zum Beispiel liegt die erste Datei bei I: (I:\Start.bat) und soll die Zieldatei auf C: (C:\Ziel.bat) aufrufen, jedoch nicht beim Anfang.
Auf Facebook teilen
Auf X (Twitter) teilen
Auf Reddit teilen
Auf Linkedin teilen

Content-ID: 390909

Url: https://administrator.de/forum/batch-datei-bei-sprungmarke-innerhalb-batch-aufrufen-390909.html

Ausgedruckt am: 17.05.2025 um 15:05 Uhr

rubberman
Lösung rubberman 27.10.2018 aktualisiert um 15:58:58 Uhr
Goto Top
Übergib die Marke als Argument.
Bsp.:

a.bat
@echo off &setlocal
echo in %~nx0
call "b.bat" x  
echo in %~nx0
call "b.bat" y  
echo in %~nx0
pause


b.bat
if "%~1" neq "" call :%~1  
exit /b

:x
echo label :x in %~nx0
exit /b

:y
echo label :y in %~nx0
exit /b

müsste diese bei einer gewissen Sprungmarke fortgesetzt werden
Fortsetzen geht natürlich nicht. Da aber der CALL Befehl dafür sorgt, dass b.bat imselben cmd.exe Prozess läuft wie a.bat, sollte das unerheblich sein.

Steffen
Penny.Cilin
Penny.Cilin 27.10.2018 um 17:45:22 Uhr
Goto Top
was ist eigentlich Batch-Datch?
Googlesuche ist erfolglos.
rubberman
rubberman 27.10.2018 um 18:08:38 Uhr
Goto Top
Deutschland, Österreich und Schweiz. Allerdings nicht nebeneinander, sondern gestapelt.
RIPUED
RIPUED 31.10.2018 um 13:06:08 Uhr
Goto Top
Hallo nochmal,

erstmal sorry, dass ich so ungeheurlich verspätet antworte. Am Wochenende war ich nach der Fragestellung nicht mehr da und das bisschen Zeit in den letzten zwei Tage verbrachte ich mit coden und testen.

Vielen Dank für deine Lösung, sie funktioniert generell einwandfrei. Leider gibt es einen Bug, welchen ich mir einfach nicht erklären kann. Und zwar wird die Datei B erneut aufgerufen, nachdem diese eigentlich zuende ist:

Datei A
@echo off
if "%~1" neq "" call :%~1  
cls
echo.
echo. hier Datei A
pause>NUL
call B.bat sprung


Datei B
if "%~1" neq "" call :%~1  
echo. (should not see me)
:sprung
echo.
echo. OK, Datei B wurde aufgerufen
pause>NUL

Ich sehe, dass du bei Datei B vermutlich deswegen einen exit-Befehl ist. Das lässt sich wohl nicht vermeiden, oder? Wieso ist das so?
Ach so, ich habe in Datei A das setlocal entfernt, ist das in Ordnung?
Was ist eigentlich genau %~1? Deswegen kann ich mir die ganze Zeile dazu nicht erklären, was diese macht.

PS: Ich habe in beiden Dateien die Zeile "if "%~1" neq "" call :%~1" hinzugefügt, weil teilweise sich eine einzige Batch-Datei selber woanders hinkopieren und von dort aus weitergeführt werden muss.
rubberman
rubberman 31.10.2018 aktualisiert um 16:06:37 Uhr
Goto Top
call :labelist nichtgoto label
Es ruft eine Subroutine auf, die mit :label beginnt und mit einem exit /b oder goto :eof endet.
Danach wird der Programmablauf nach dem call Aufruf fortgesetzt. Verhält sich also genauso wie der Aufruf von Prozeduren in jeder anderen Sprache.
Das exit /b (alternativ auch hier goto :eof) nach dem call Aufruf sorgt also dafür, dass die Ausführung des Batchscripts verlassen wird und ist somit notwendig.

Was das
if "%~1" neq "" call :%~1
in Datei A zu suchen hat, erschließt sich mir nicht. Es gibt nicht einmal ein Label in diesem Code das angesprungen werden könnte.

Steffen
RIPUED
RIPUED 31.10.2018 um 16:53:40 Uhr
Goto Top
Nochmals Danke,

ich denke, ich habe jetzt erst wirklich den Call-Befehl verstanden, ich habe eben dazu noch etwas gelesen.
Kannst du mir zum Verständnis noch kurz sagen, was if "%~1" neq "" call :%~1 genau macht?
Ich verstehe ja (glaube ich) das wenn %~1 ungleich "" (nichts) ist, soll eben %~1 aufgerufen werden.

Aber was ist %~1 überhaupt?
rubberman
rubberman 31.10.2018 um 17:13:13 Uhr
Goto Top
Argumente die du an ein Script übergibst, finden sich in den Parametervariablen %1 bis %9 wieder.
In deinem Fall übergibst du nur ein Argument, somit ist lediglich %1 interessant. Die Tilde in %~1 entfernt umschließende Anführungszeichen im Parameterwert, sofern es welche gibt.
if "%~1" neq "" prüft also ob ein Argument übergeben wurde. Falls bspw. "label" als Argument übergeben wurde, dann expandiert %~1 zu label und das resultierende IF Statement wäre
if "label" neq "" call :label

Steffen