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...
Gruß OKIDOKI
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 180540
Url: https://administrator.de/contentid/180540
Ausgedruckt am: 19.11.2024 um 17:11 Uhr
9 Kommentare
Neuester Kommentar
Hallo OKIDOKI!
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:
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 "
Der Aufruf, um bei ":Marke2" zu starten, würde dann so aussehen:
oder
Grüße
bastla
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 ... 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
/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
"D:\Dein Batch.cmd" Marke2
bastla
Hallo Zusammen.
Alternativ könnte man per CALL die Label als Subroutinen aufrufen:
call_test.bat
test.bat
Grüße
rubberman
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
moinsen,
*hüstel...
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...
*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.
Hallo OKIDIKI.
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
Und wenn du nicht siehst, welcher Weg genommen wird, solltest du in der Tat T-Mo's Rat befolgen und
entfernen oder, der besseren Übersicht wegen, durch
ersetzen.
Grüße
rubberman
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?
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