batchfan
Goto Top

Batchaufruf per CALL aus einer 1.Batch und dortiger Verarbeitung ausschließlich eines Labels

Werte Batch-Freunde
Eine 2.Batch aus einer Ur-Batch aufzurufen mithilfe von Steuervariablen und den Schritt zurück bekomme ich hin.
Aber kann ich das auch anderes lösen ?

Diese Batch1 ruft in einer batch2 ein bestimmtes Label auf und verläßt nach Abarbeitung des Labels die Batch2
Das ganze 2x

REM BAT1
@echo off
cls
echo ____ 1.Aufruf bat2.bat step1 ___
call bat2.bat step1 ende
echo zurück in bat1.bat
rem
echo ____ 2.Aufruf bat2.bat step2 ____
call bat2.bat step2 ende
echo zurück in bat1.bat
:ende

REM BAT2
@echo on
if "%2" equ "" (  
                        echo Spung zum Label ok ... aber :
                        echo keinen Ausstiegsparameter angegeben. Abbruch.
                        pause
                        goto ende
                         )
for %%v in ( step1 step2 ) do if "%1" equ "%%v" goto %%v  
:step1
echo Befehle ......
if "%2" equ "ende" goto ende  
:step2
echo Befehle ......
if "%2" equ "ende" goto ende  
:ende

Gibt es andere Möglichkeiten ?
Lieben Dank für Euere Antworten ... !!!!!

[Edit Biber] Als Code formatiert. [/Edit]

Content-Key: 176737

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

Ausgedruckt am: 29.03.2024 um 04:03 Uhr

Mitglied: Biber
Biber 23.11.2011 um 21:47:23 Uhr
Goto Top
Moin Batchfan,

zur Beantwortung deiner Frage müssten wir vielleicht dein Ziel, den grossen Plan kennen.

Meine erste Gegen-Frage wäre:
Warum sind denn zwei (oder zweiundzwanzig?) Einzel-One-Trick-Batches sinnvoller und wartbarer als EINE Batchdatei?

Es geht auch mit "Call :BlockInDerGleichenBatchdatei auchMitParameter1 undPara2 usw"

Bei Sprungmarken musst du immer ein explizites "goto RausAusDemJob" oder "goto VersuchsNochMal" angeben nach jedem Block/Label.
Ist nicht sehr flexibel und schon gar nicht wartbar.
Du siehst ja keinem Mädel Label an, wer es wann und von wo anspringt.

Besser ist schon eine Mimik mit geCALLten internen Unterroutinen und deren Rückkehr zu der aufrufenden Zeile.

Grüße
Biber
Mitglied: Batchfan
Batchfan 24.11.2011 um 05:01:06 Uhr
Goto Top
Hallo Biber
Ich habe nun schon mehrfach größere Anwendungen geschrieben, auch damls in DCL (VMS) und so ... Allerdings habe ich mich dabei in der Feinheit der Anwendungen nicht wirklich weiterentwickelt weil das gröbere ja auch ging und ich es nicht besser wußte. Nebenbei wurden die Betriebssysteme (VMS) und meine Schukung darauf nicht wirklich weitergeschult. Wie dem auch sei ....
Ich kann mich gut in größeren Batchstrukturen bewegen, wenn ich mit lokalen Variablen oder z.N. Kontrolldateien arbeite ... aber wie gesagt, z.B. reguläre Ausdrücke, komplexe For-Schleifen oder kopfgesteuerte Schleifen ect. habe ich mir immer selber gestrickt. Wenn ich aber das sehe, was ihr hier so zusammenstellt, wird mir ganz schummerig. Aber ich will das lernen .

In diesem Fall würde mich interesieren, ob ein Aufruf :
CALL Bat2.bat :Marke
funktioniert und wie am Ende der angesteuerten Marke ein Ausstieg aus Batch2 anders möglich ist als ich es oben gezeigt habe.

Gruß volker
Mitglied: Skyemugen
Skyemugen 24.11.2011 um 09:02:12 Uhr
Goto Top
Aloha,

auch wenn mir das ebenso halb-sinnig erscheint, du könntest doch in der 1. Batch call batch2.bat :Marke aufrufen und in der zweiten Batch
@echo off
call %1
goto :eof
echo Nicht in der Marke
pause
goto :eof

:Marke
echo Mittendrin
goto :eof

oder wenn du (ich blick deine Struktur heute nicht) unbedingt %2 auf ende abfragen willst, dann eben per call batch2.bat :Marke ende die zwete aufrufen.

greetz André
Mitglied: Batchfan
Batchfan 24.11.2011 um 17:17:36 Uhr
Goto Top
@echo off
rem bat3.bat
echo ____ 1.Aufruf bat3.bat step1 ___
call bat4.bat :step1
echo zurück in bat3.bat
echo ____ 2.Aufruf bat3.bat step2 ____
call bat4.bat :step2
echo zurück in bat3.bat
goto ende
:ende

@echo off
rem Bat4.bat
call %1
:step1
echo Hier ist bat4.bat step1
goto :eof
:step2
echo Hier ist bat4.bat step2
goto :eof

Ausgabe:
____ 1.Aufruf bat3.bat step1 ___
Hier ist bat4.bat step1 << wäre ok
Hier ist bat4.bat step1 << aber hier die Ausgabe ein 2.tes mal ?
zurück in bat3.bat
____ 2.Aufruf bat3.bat step2 ____
Hier ist bat4.bat step2 << wäre ok
Hier ist bat4.bat step1 << Ausgabe einer vorherigen Marke ?
zurück in bat3.bat

Habe XP SP2 auf dem Rechner ... geht das überhaupt damit, das man eine nichtvorhandene Marke :eof anspringt ?
Normalerweise sollte ein Fehler gemeldet werden. Da das nicht ist, sollte es wohl ok sein.

Was ich sehe ist, das ein Sprung mal soeben in den nächsten Batch nicht möglich ist.
Gruß volker
Mitglied: Biber
Biber 24.11.2011 um 20:38:31 Uhr
Goto Top
Moin Batchfan,

bitte benutze Codeformatierung.

Füge in Bat4.bat zwischen der 3.ten Zeile ("call %1") und Zeile 4 (":step1") eine neue Zeile ein mit "goto :eof"

Die Ausgabe sollte sich ändern in

1.Aufruf bat3.bat step1
Hier ist bat4.bat step1
zurück in bat3.bat
2.Aufruf bat3.bat step2
Hier ist bat4.bat step2
zurück in bat3.bat


Grüße
Biber
Mitglied: Batchfan
Batchfan 25.11.2011 um 18:57:54 Uhr
Goto Top
Lieben Dank, Biber

So, das muss man also wissen face-smile

@echo off << 1. Komme aus Batch3 mit der Sprunganweisung zu :step1 im Gepäck.
call %1 <<-- 2. hier sagt jetzt CALL gehe zu :step1(%1)
goto:eof <<-- 5. Hier die Essenz: Diese Anweisung verhindert nun eine 2. Abarbeitung des Step1 !!! und geht wirklich zum :EOF des File
:step1 <<-- 3.ab hier abarbeiten bis ein GOTO :EOF kommt.
echo irgendwas..
goto :eof <<-- 4.Dieses GOTO :EOF sagt dem Commandointerpreter beende den Call-Aufruf und gehe zur 1.Folgezeile nach dem CALL aus Zeile2
:step2
echo irgendwas ...
goto :eof

Die Abarbeitung eines CALL :Marke beginnt mit der :Marke und Endet bei GOTO EOF.
Um eine weitere Abarbeitung der Folgebefehle nach CALL auszuschließen muß hier
z.B. mit einem zweiten GOTO :EOF der Sprung zum Ende der Unterbatch angewiesen
werden.

Will man das etwas irrige mit dem Goto :EOF einfacher haben,
dann kann man auch so verfahren.

@echo off
rem Batch bat3.bat
cls
echo Aufruf Bat4, Step1
call bat4.bat step1
echo zurück in bat3
echo.
echo Aufruf Bat4, Step2
call bat4.bat step2
echo zurück in bat3
goto ende
:ende

@echo off
rem Bat4.bat
goto %1 <<-- 1.Sprung zur Marke step1
:step1 <<-- 2. Abarbeitung
echo irgendwas ...
goto :eof <<-- 3. diese Anweisung beendet wirklich Bat4 im 1. Aufruf
:step2 <<-- 4. zurück und 2. Aufruf
echo irgendwas ...
goto :eof <<-- 5. diese Anweisung beendet wirklich Bat4 im 2. Aufruf

Ausgabe:
Aufruf Bat4, Step1
irgendwas ...
zurück in bat 3

Aufruf Bat4, Step2
irgendwas ....
zurück in bat3

Zum guten Schluss: Ist %1 nicht oder fehlerhaft gesetzt gibts einen unkontrollierten Abbruch.

Danke an alle, ich schließe diesen Eintrag damit face-smile
Gruß volker