okidoki
Goto Top

Batch an bestimmter Sprungmarke starten

Guten Abend, bin durch bastla und diesen Beitrag auf das Problem aufmerksam geworden:
https://www.administrator.de/index.php?content=96670

Folgendes Problem: Ich habe eine sehr komplexe Batch mit vielen Sprungmarken. Nun möchte aus einem CD-Menü heraus verschiedene Sprungmarken ansteuern. Das hat den Sinn, dass ich nicht jedes Mal eine neue Batch anlegen muss, sondern eine Batch für die unterschiedlichsten Anwendungen nutze.
Jetzt ist mir allerdings nicht der Inhalt (zweite Zeile von AndererBatch) klar. Nach Bastlas Überlegung müsste ich mit meinem Menü jeweils eine Datei anlegen, wenn die vorhanden ist abfragen lassen und dann wie in Zeile 2 (die ich nicht verstehe) von AndererBatch abfragen lassen.
Gibt es dazu noch eine mögliche Alternative? (Vielleicht batch mit Parameter/Sprungmarke starten) Ansonsten wäre ich schon über eine Erklärung der 2. Zeile von AndererBatch glücklich...

:: 1. Batch
@echo off & setlocal
if exist C:\jetztnicht.txt C:\AndererBatch.bat jetztnicht
::weiterer Ablauf wie immer
::
::



::AndererBatch.bat
@echo off & setlocal
if "%~1"=="jetztnicht" goto :start  
::weiterer Ablauf wie immer
::
::
:start
echo Fangen wir doch gleich hier an ...
::Damit das aber nicht jedes Mal passiert:
if exist C:\jetztnicht.txt del C:\jetztnicht.txt

Gruß OKIDOKI

Content-ID: 180540

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

Ausgedruckt am: 19.11.2024 um 17:11 Uhr

bastla
bastla 14.02.2012 um 21:17:18 Uhr
Goto Top
Hallo OKIDOKI!
Ansonsten wäre ich schon über eine Erklärung der 2. Zeile von AndererBatch glücklich...
Na dann will ich mal versuchen, Dich glücklich zu machen ... face-wink

In der angesprochenen Zeile wird einfach nur geprüft, ob die Datei "C:\jetztnicht.txt" existiert - falls ja, wird der Batch "C:\AndererBatch.bat" gestartet und als Aufrufparameter "jetztnicht" übergeben. Dieser Parameter kommt im zweiten Batch als %1 an und kann dort für die Verzweigung zum richtigen Programmteil genutzt werden.
Wenn es nur darum geht, dass ein Batch gleich ab einer bestimmten Sprungmarke ausgeführt wird, könntest Du einfach an den Anfang etwa folgende Konstruktion setzen:
@echo off & setlocal
if #%~1# neq ## findstr /i /b /c:":%~1" "%~f0">nul && goto :%~1 
::kein Sprung erfolgt, daher Start von Anfang an
Hier wird geprüft, ob ein Parameter übergeben wurde, und wenn ja, ob eine gleichnamige (bis auf Groß-/Kleinschreibung) Sprungmarke (darf nicht eingerückt sein, ansonsten "/b" weglassen) existiert - wenn wieder ja: Sprung zu dieser Marke. Ist kein Sprung erfolgt, geht es einfach in der nächsten Zeile weiter. Besonderheiten: Da in einer Sprungmarke auch Leerzeichen vorkommen dürfen (würde ich aber nie machen), muss einerseits mit "/c:" festgelegt werden, dass "findstr" den gesamten Suchbegriff verwendet und andererseits mit "%~1" dafür gesorgt werden, dass umgebende Anführungszeichen (die ja beim Aufruf verwendet werden müssten) entfernt werden. Ach ja - der gerade aufgerufene Batch "kennt sich selbst" als %0 (wobei bei einem Aufruf unter Anführungszeichen der Typ ".cmd" oder ".bat" zwingend angegeben werden muss) ...

Der Aufruf, um bei ":Marke2" zu starten, würde dann so aussehen:
DeinBatch Marke2
oder
"D:\Dein Batch.cmd" Marke2
Grüße
bastla
rubberman
rubberman 14.02.2012 um 21:35:53 Uhr
Goto Top
Hallo Zusammen.

Alternativ könnte man per CALL die Label als Subroutinen aufrufen:

call_test.bat
@echo off &setlocal
call test label1
call test label3
call test label2
call test label4
pause

test.bat
@echo off
if "%~1" neq "" call :%~1 2>nul|| echo Label :%~1 existiert nicht  
goto :eof

:label1
echo hier ist label1
goto :eof

:label2
echo hier ist label2
goto :eof

:label3
echo hier ist label3
goto :eof

Grüße
rubberman
OKIDOKI
OKIDOKI 14.02.2012 um 22:31:42 Uhr
Goto Top
Vielen Dank schon einmal, ich muss das in Ruhe noch einmal ausprobieren...

Zu rubberman: mit ist call_test.bat nich so ganz klar, wie entsteht denn der Batch? Werden hier nicht nur alle Abfragen abgearbeitet?
Zu bastla: das sieht ja sehr kompliziert aus ...
Folgenden Wunsch hätte ich noch, damit es vielleicht einfacher wird:
Der aufgerufe Menüpunkt schreibt in eine txt seine Sprungmarke: z.B. Sprung1 (Möglicherweise gibt es 10 Sprungmarken oder mehr). Jetzt soll überprüft werden, ob eine Sprungmarke vorhanden ist. Nun bräuchte doch einfach nur die Sprungmarke ausgelesen zu werden (Variable, wobei die txt dann wieder gelöscht wird wie schon von bastla vorgeschlagen) und die Batch an der entsprechenden (ausgelesenen Sprungmarke) gestartet werden.
Ist das praktikabel und kannst du dies noch anpassen? Es geht also nicht nur darum die Batch an einer bestimmten Stelle zu starten, sondern es soll eine "txt-Sprungmarke" ausgelesen werden, wenn vorhanden, und die Batch dann an dieser Stelle gestartet werden.

So ähnlich?:
@echo off 
if exist sprung.txt (GOTO weiter) else (GOTO EOF)
:weiter
set /p sprung=<sprung.txt
DeinBatch %sprung%
del sprung.txt
goto :eof

Gruß OKIDOKI
bastla
bastla 14.02.2012 um 22:41:29 Uhr
Goto Top
Hallo OKIDOKI!

Wozu soll die Textdatei gut sein? Der "Menüpunkt" kann doch den Batch direkt mit Übergabe der Sprungmarke als Parameter (wie oben gezeigt) aufrufen ...
Zu bastla: das sieht ja sehr kompliziert aus ...
... weswegen es auch eine Beschreibung dazu gibt ... face-wink

Grüße
bastla
60730
60730 14.02.2012 um 22:49:56 Uhr
Goto Top
moinsen,

*hüstel...
Ist das praktikabel und kannst du dies noch anpassen?

  • Wenn du dir die Mühe gibst und ein paar ältere Freds der Antworter durchliesst, dann bekommst du eine Ahnung, was die notfalls alles anpassen können.

Aber - darum geht es hier garnicht - "wenn" "wir" hier jemandem was schreiben, dann hoffen wir, dass der sich diese Schnippsel zum spielen vornimmt und dann bekommt derjenige auch relativ schnell einen Einblick wie und was geht oder nicht.

Zu Rubbermans Zeilen...

  • nimm das/beide €cho off raus.
rubberman
rubberman 15.02.2012 um 00:05:06 Uhr
Goto Top
Hallo OKIDIKI.

Zitat von @OKIDOKI:
Zu rubberman: mit ist call_test.bat nich so ganz klar, wie entsteht denn der Batch? Werden hier nicht nur alle Abfragen
abgearbeitet?

Damit du verstehst was passiert, habe ich extra die Reihenfolge verdreht (1 3 2) und zusätzlich aufgezeigt, wie du mit fehlerhaften/nicht existierenden Labeln umgehen kannst (4).

Irgendwie scheint es mir, als kannst du mit der ganzen Geschichte nur wenig anfangen. %1 expandiert zum ersten übergebenen Argument. Die Tilde in %~1 entfernt zusätzlich umschließende Anführungszeichen (sofern vorhanden).

Was ich wiederum nicht begreife ist (wie auch bastla bereits angemerkt hat), warum du mit irgendwelchen zusätzlichen Textdateien herum experimentieren willst. In deinem Eingangspost sagst du, dass das ganze menügesteuert ablaufen soll. Ergo rufe doch den Batch (je nach gewähltem Menüpunkt) mit einem entsprechenden Argument auf. Also das, was in meinem Beispiel call_test.bat tut.

Zum besseren Verständnis eine veränderte call_test.bat
@echo off
echo 1  label1
echo 2  label2
echo 3  label3
echo(
set /p "n=Gib eine der Nummern ein: "  
echo(
call test label%n%
pause

Und wenn du nicht siehst, welcher Weg genommen wird, solltest du in der Tat T-Mo's Rat befolgen und
@echo off
entfernen oder, der besseren Übersicht wegen, durch
@prompt $g
ersetzen.

Grüße
rubberman
pieh-ejdsch
pieh-ejdsch 15.02.2012 um 18:36:36 Uhr
Goto Top
moin,

Sprungmarke (darf nicht eingerückt sein, ansonsten "/b" weglassen) existiert - wenn wieder ja: Sprung zu dieser Marke.

dann sollte es diese Zeile auch schon erledigen
findstr /i /r /c:"^ *:%~1 *$" "%~f0" && echo weiter von hier && goto %~1  
rem doch von vorn

Gruß Phil
OKIDOKI
OKIDOKI 15.02.2012 um 20:52:03 Uhr
Goto Top
Leute, ihr habt so recht...

Mittlerweile, finde ich zumindest, nehme ich mir die Sachen immer so vor, dass damit rumspiele bis ich nicht weiterkomme. Dabei stoße ich, zugegebenermaßen, oft auf weitere Hindernisse. Allerdings verbringe ich damit oft Stunden zu.
Also, falls meine Arbeit oberflächlich wirkt bitte ich hiermit um Rücksicht - oft sehe ich abends den Wald vor lauter Bäumen nicht face-wink

Das Rumgeamche mit der Textdatei war nur, weil wir anfänglich davon ausgegangen waren!

Die Vorgehensweisen bei euch sind mir jetzt - eigentlich - soweit klar. Mit Menugesteuert meinte ich glaube was anderes als was ich geschrieben hatte: Es wird quasi etwas gestartet oder ausgeführt, daher die Textdatei, die ausgelesen wird, damit er weiß, an welcher Stelle er starten soll.
Vielleicht könnt ihr es euch nicht mehr vorstellen, wei schwer es ist, sich in diese Sprache hineinzudenken face-wink. Ich bin richtig überwältigt, wie TimoBeil zu recht anmerkt, was ihr alles möglich macht - echt! Ich habe auch versucht das immer auszudrücken!!!

Ich fasse zusammen:

Wenn meine Menu, was ja nur eine batch auslösen kann funktionieren soll, reicht es doch, nach eurer Vorarbeit und pieh-ejdsch Zusammenfassung, pieh-ejdsch´s Zeile in den "Hauptbatch" zu schreiben. Aus meinem Menu müsste dann nur jeweils gestartet werden, wie bastla schrieb: DeinBatch Marke2 oder DeinBatch Marke3 oder DeinBatch Marke2 oder ...
Dann hätte ich meine ~ 10 Menubatches (je DeinBatch Marke2, oder 3 oder ...) und meine Hauptbatch mit der übrig gebleibenen Zeile von Phil, der die Eingabe der zuvor gestarteten Batch übernernimmt!
Das werde ich jetzt mal in Ruhe testen face-wink und mich dann wieder melden face-wink

Seid herzlich gegrüßt und bitte nicht genervt von meiner Blauäugigkeit - DANKESCHÖN -

Gruß OKIDOKI
OKIDOKI
OKIDOKI 19.02.2012 um 20:24:03 Uhr
Goto Top
Guten Abend,

ich war die ganze Woche unterwegs, daher konnte ich erst heute in Ruhe probieren!
Es klappt super - ich bin total begeistert und dankbar!

Noch einmal vielen Dank für eure Hilfe und eure Geduld!

Gruß OKIDOKI