ripued
Goto Top

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.

Content-Key: 390909

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

Printed on: April 24, 2024 at 07:04 o'clock

Member: rubberman
Solution rubberman Oct 27, 2018 updated at 13:58:58 (UTC)
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
Member: Penny.Cilin
Penny.Cilin Oct 27, 2018 at 15:45:22 (UTC)
Goto Top
was ist eigentlich Batch-Datch?
Googlesuche ist erfolglos.
Member: rubberman
rubberman Oct 27, 2018 at 16:08:38 (UTC)
Goto Top
Deutschland, Österreich und Schweiz. Allerdings nicht nebeneinander, sondern gestapelt.
Member: RIPUED
RIPUED Oct 31, 2018 at 12:06:08 (UTC)
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.
Member: rubberman
rubberman Oct 31, 2018 updated at 15:06:37 (UTC)
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
Member: RIPUED
RIPUED Oct 31, 2018 at 15:53:40 (UTC)
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?
Member: rubberman
rubberman Oct 31, 2018 at 16:13:13 (UTC)
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