37414
21.05.2020
3196
15
0
Aufrufende Batchdatei wird trotz CALL-Befehl beendet
Hallo,
ich stricke gerade an einer kleinen Batchdatei, die ein Auswahlmenü darstellt zur Auswahl verschiedener Backup-Dateien.
Rufe ich jetzt z.B. die Datei mit der Nummer [5] auf, startet zwar die entsprechende Batch, aber nach der Abarbeitung dieser Batchdatei ist auch die aufrufende Datei (also die mit dem Auswahlmenü) beendet.
Vom Code her sollte das meiner Meinung nach aber anders sein...
Hier der Code meiner Auswahlmenü-Batch:
Danke und Gruß,
imebro
ich stricke gerade an einer kleinen Batchdatei, die ein Auswahlmenü darstellt zur Auswahl verschiedener Backup-Dateien.
Rufe ich jetzt z.B. die Datei mit der Nummer [5] auf, startet zwar die entsprechende Batch, aber nach der Abarbeitung dieser Batchdatei ist auch die aufrufende Datei (also die mit dem Auswahlmenü) beendet.
Vom Code her sollte das meiner Meinung nach aber anders sein...
Hier der Code meiner Auswahlmenü-Batch:
@ echo off &setlocal
echo.
echo.
echo.
echo [1] Laufwerk "E" auf externe Festplatte
echo [2] Firefox und Thunderbird
echo [3] Musik (Volumio) auf externe 1-TB-Festplatte
echo [4] normales Tagesbackup
echo [5] Test
echo [6]
echo [7]
echo.
echo.
set asw=0
set /p asw="Bitte Auswahl eingeben: "
if %asw%==1 goto LW_E
if %asw%==2 goto FF_TB
if %asw%==3 goto MUSIK
if %asw%==4 goto TAG
if %asw%==5 goto TEST
if %asw%==6 goto
if %asw%==7 goto
goto END
:LW_E
echo Laufwerk "E" auf externe Festplatte sichern
call "D:\Desktop\BACKUP\Backup E vom Laptop nach Backup G auf ext. FP.bat"
goto END
:FF_TB
echo Firefox und Thunderbird sichern
call "D:\Desktop\BACKUP\Backup Firefox + Thunderbird.bat"
goto END
:MUSIK
echo Musik (Volumio) wird gesichert
call "D:\Desktop\BACKUP\Backup Musik (Volumio) auf ext_FP_1TB.bat"
goto END
:TAG
echo Das normale Tagesbackup wird durchgeführt
call "D:\Desktop\BACKUP\Robocopy_Tagesbackup.bat"
goto END
:TEST
echo Das ist das Testbackup
call "D:\Desktop\BACKUP\Z_Batch-Vorlage.bat"
goto END
:END
pause
Danke und Gruß,
imebro
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 574082
Url: https://administrator.de/contentid/574082
Ausgedruckt am: 25.11.2024 um 03:11 Uhr
15 Kommentare
Neuester Kommentar
Hallo,
Gruß,
Peter
Zitat von @37414:
Vom Code her sollte das meiner Meinung nach aber anders sein...
Warum soll dein Batch was anderes zun als dort steht? KI etwa?Vom Code her sollte das meiner Meinung nach aber anders sein...
Ich hatte die Info, dass der Call-Befehl eine andere Batch aufruft, diese komplett abarbeitet und dann wieder zur ursprünglichen Batch zurückkehrt (also zu der aufrufenden Batch).
Tut sie ja auch.Dann müßte doch eigentlich - nachdem die Bckup-Batch abgearbeitet ist - die Menü-Batch wieder im Vordergrund stehen, damit man ggf. die nächste Nummer aufrufen kann.
Ist ja auch so, wenn du die Batch nicht beendet hast. Aber warum soll die wieder vorne anfangen und alles wieder neu mach? Hast vdu doch gar nicht gesagt. Batch kam mit den Rechner lange bevor es Windows und Grafische Elemente gab. Geh mal in einer grösseren Bücherei und such dir die Hanbücher zu Batch raus und lerne.Unten ist ja auch eine "pause" eingetragen, sodass die Menü-Batch auf jeden Fall offen bleiben sollte.
Passiert ja auch nur das jetzt noch dort steht "Bitte eine Taste drücken"...Gruß,
Peter
Moin,
Tutorial zur FOR-Schleife
Windows Batch Grundlagen
Rechnen in Batch
u.s.w.
Wenn siech das ganze nciht so verhält wie Du denkst, hast Du offensichtich etwas falsch erwartet.
Dein Skript macht aber ganz genau das was Du hingeschrieben hast. Es ruft Test auf und springt zum Ende und beendet sich dann. Wenn Du willst, daß es wieder von vorne losläuft, mußt Du wieder an den Anfang springen lassen, d.h. einen Sprunziel "START" defineiren" und mit goto dorthin springen.
lks
Tutorial zur FOR-Schleife
Windows Batch Grundlagen
Rechnen in Batch
u.s.w.
Wenn siech das ganze nciht so verhält wie Du denkst, hast Du offensichtich etwas falsch erwartet.
Dein Skript macht aber ganz genau das was Du hingeschrieben hast. Es ruft Test auf und springt zum Ende und beendet sich dann. Wenn Du willst, daß es wieder von vorne losläuft, mußt Du wieder an den Anfang springen lassen, d.h. einen Sprunziel "START" defineiren" und mit goto dorthin springen.
lks
Hallo,
Und bedenke das dein Monitor eine separate Darstellungseinheit bildet die von deinerr Batch vollkommen losgelöst operiert (Nicht wie ein Blutdruckmessgerät oder Smartphone)
Gruß,
Peter
Zitat von @37414:
Hmmm... verstehe ich nicht.
Batch ist schon 40 Jahre alt und ar älter.Hmmm... verstehe ich nicht.
OK, der Hinweis auf "von vorne anfangen" war verwirrend und nicht korrekt.
Doch. 100% richtig,Hier wird kopiert und direkt danach erscheint im CMD-Fenster die Meldung "Sicherung beendet!" sowie darunter der Hinweis "drücken Sie eine beliebige Taste...".
WEIL das eben das letzte ist was deine Batch tun soll. Und ein Pause /? in ein CMD Fenster zeigt dir gar was Pause alles kann bzw. tut. Und auch die Lektüre zu Pause alleine füllt ganze Bücher (damals noch in Papierform)Letzteres wird ja durch den Eintrag "pause" in der Batch verursacht. Richtig so?
Da das deine letzte Anweisung war und Pause eben ein "drücken Sie eine beliebige Taste..." erzeugt, Ja.Nun hatte ich folgendes angenommen (und das ist für mich auch jetzt noch logisch):
Annehmen kannst du vieles. Aber ob dein Anweisung das so tut ist immer wieder mal auch anders. Und logisch muss es nur für den Programmierer von Pause sein (Der Ist aber jetzt wohl schon in Rente) MShat nie behauptet etwas zu tun was für den Anwender logisch sein muss. Und dann müsste erst noch diese Logik festgeschrieben werden. Du weißt doch für was MS-DOS steht? MicroSoft Disk Operating System - also nichts mit KI oder Logik.- und nun ist im Hintergrund immer noch das CMD-Fenster mit Batch 1 offen, da dieses ja mit dem Eintrag "pause" endet. Es müßte also in diesem CMD-Fenster noch der Hinweis "drücken Sie eine beliebige Taste..." stehen. Oder bin ich jetzt vollkommen daneben?
Ja, wenn du es festgeschrieben hast. Übrigens in deiner Beispiel Batch ist Zeile 9 mit goto END so überflüssig wie Essen gehen nach einen üppigen Gala Dinner.Deine Batch geht doch ganz alleine nach :END. Und es war nie gut und es ist immer noch nicht gut Sprungmarken zu benennen wie interne KommandosUnd bedenke das dein Monitor eine separate Darstellungseinheit bildet die von deinerr Batch vollkommen losgelöst operiert (Nicht wie ein Blutdruckmessgerät oder Smartphone)
Gruß,
Peter
Zitat von @37414:
Batch2
Batch2
> @ echo off &setlocal
>
> set Quelle="D:\Desktop\blabla"
> set Ziel="E:\blabla"
>
> robocopy %Quelle% %Ziel% /MIR
>
> :EOF
>
Da gehört ein EXIT /B ans Ende. Sonst wird die CMD beendet statt wieder zum ersten Skript zu springen.
lks
Hallo,
Gruß,
Peter
Zitat von @37414:
So... Batch1 ruft also Batch2 auf, wodurch sich ein zusätzliches Konsolenfenster öffnet (oder nicht?). Nachdem Batch2 dann abgearbeitet ist, schließt sich deren Fenster automatisch (da :EOF).
Schau mal https://docs.microsoft.com/de-de/windows-server/administration/windows-c ... und https://docs.microsoft.com/de-de/windows-server/administration/windows-c ...So... Batch1 ruft also Batch2 auf, wodurch sich ein zusätzliches Konsolenfenster öffnet (oder nicht?). Nachdem Batch2 dann abgearbeitet ist, schließt sich deren Fenster automatisch (da :EOF).
Und dann hätte ich gedacht, dass ich dann wieder automatisch in Batch1 lande, wo dann im Konsolenfenster dort steht "Sicherung beendet!" und direkt darunter "drücken Sie eine beliebige Taste...".
Aber das ist so nicht, wie ja schon mehrfach beschrieben.
Warum?
Es tut was du ihm sagst. Und wenn nicht hast etwas nicht gesagt/ falsch gesagt.Warum?
Gruß,
Peter
Zitat von @37414:
Funktioniert also so.
Funktioniert also so.
Dann fehlt nur noch Wie kann ich einen Beitrag als gelöst markieren?
Aber dennoch befinde ich mich immer in einem Fenster. Aber vielleicht soll das ja so sein und ich hatte einfach nur falsch angenommen, dass 2 Fenster entstehen durch den Call-Befehl.
Du bist einfach von falschen Annahmen ausgegangen. Ein Grundsatz gilt bei Programmen und Skripten immer:
Das Programm/Skript macht nicht das, was Du denkst, sondern das, was Du hingeschrieben hast!
lks
Hallo imebro,
auch wenn du die Frage schon als gelöst markiert hast, möchte ich doch noch ein paar Bemerkungen loswerden.
Erst einmal: wie kommst du auf die Idee, dass ein CALL ein neues Fenster öffnen sollte? Batch weiß von Fenstern nichts, und dass es jetzt nicht mehr Teil von DOS ist, sondern unter CMD läuft, ändert daran nichts.
Dann habe ich mal deine "2 neue und ganz einfach Beispiele" von gestern Abend ausprobiert, allerdings den ROBOCOPY durch ein einfaches ECHO ersetzt. Und es funktioniert exakt wie erwartet: Erst die Anzeige aus der batch1, dann die aus der batch2, dann der Hinweis "Sicherung beendet!", dann der Pause-Befehl. Dabei ist es natürlich egal, ob ich die Batch per Doppelklick ausführe oder aus dem CMD-Fenster. Und auch ein EXIT /B in der batch2 ist dazu nicht nötig.
Hardcopies deiner Versuche hast du ja leider keine gezeigt, daraus hätte man vielleicht etwas schließen können. Vielleicht hast du die erste Batch geschlossen, aber gedacht, dass es sich um das "zweite Fenster" handelt?
Und da du in deinem funktionierenden Script ja (außer dem nicht benötigten EXIT /B) nur den GOTO ergänzt hast, gehe ich davon aus, dass es auch schon vorher geklappt hat.
Ach ja, ich habe mir angewöhnt, generell in einer Zeile nicht mehrere Befehle einzugeben. Das macht die Batch übersichtlicher und macht es auch leichter, einzelne Zeilen auszukommentieren. Und ich wüsste auch nicht, was der SETLOCAL hier Sinnvolles bewirken könnte.
Gruß vom
WinCobold
auch wenn du die Frage schon als gelöst markiert hast, möchte ich doch noch ein paar Bemerkungen loswerden.
Erst einmal: wie kommst du auf die Idee, dass ein CALL ein neues Fenster öffnen sollte? Batch weiß von Fenstern nichts, und dass es jetzt nicht mehr Teil von DOS ist, sondern unter CMD läuft, ändert daran nichts.
Dann habe ich mal deine "2 neue und ganz einfach Beispiele" von gestern Abend ausprobiert, allerdings den ROBOCOPY durch ein einfaches ECHO ersetzt. Und es funktioniert exakt wie erwartet: Erst die Anzeige aus der batch1, dann die aus der batch2, dann der Hinweis "Sicherung beendet!", dann der Pause-Befehl. Dabei ist es natürlich egal, ob ich die Batch per Doppelklick ausführe oder aus dem CMD-Fenster. Und auch ein EXIT /B in der batch2 ist dazu nicht nötig.
Hardcopies deiner Versuche hast du ja leider keine gezeigt, daraus hätte man vielleicht etwas schließen können. Vielleicht hast du die erste Batch geschlossen, aber gedacht, dass es sich um das "zweite Fenster" handelt?
Und da du in deinem funktionierenden Script ja (außer dem nicht benötigten EXIT /B) nur den GOTO ergänzt hast, gehe ich davon aus, dass es auch schon vorher geklappt hat.
Ach ja, ich habe mir angewöhnt, generell in einer Zeile nicht mehrere Befehle einzugeben. Das macht die Batch übersichtlicher und macht es auch leichter, einzelne Zeilen auszukommentieren. Und ich wüsste auch nicht, was der SETLOCAL hier Sinnvolles bewirken könnte.
Gruß vom
WinCobold
Hallo imebro,
du "sollst" gar nichts. Das SETLOCAL dürfte in diesem Fall vermutlich, genau wie das EXIT /B, keinen Schaden anrichten. Aber ich finde, man sollte nur Befehle verwenden, die man versteht und die tatsächlich nötig sind, um das gewünschte Ergebnis zu erreichen.
EOF selber ist meines Wissens kein Befehl, und ein GOTO EOF am Ende der Prozedur ist auch nicht nötig. Wenn alles so läuft, wie du möchtest, kannst du doch einfach alles lassen.
Noch ein Hinweis zu der Bemerkung
Das mag bei dem Beispiel, auf das sich Peter bezieht, stimmen. Aber in Bezug auf deine ursprüngliche Prozedur bin ich anderer Meinung. Natürlich ist dort das letzte GOTO nicht nötig, aber ich finde, dass die identischen Verarbeitungsblöcke das mehr als aufwiegen. Dann kannst du die nämlich beliebig verschieben oder neue einfügen, ohne dass die Steuerung kaputt geht.
Gruß vom
WinCobold
du "sollst" gar nichts. Das SETLOCAL dürfte in diesem Fall vermutlich, genau wie das EXIT /B, keinen Schaden anrichten. Aber ich finde, man sollte nur Befehle verwenden, die man versteht und die tatsächlich nötig sind, um das gewünschte Ergebnis zu erreichen.
EOF selber ist meines Wissens kein Befehl, und ein GOTO EOF am Ende der Prozedur ist auch nicht nötig. Wenn alles so läuft, wie du möchtest, kannst du doch einfach alles lassen.
Noch ein Hinweis zu der Bemerkung
Zitat von @Pjordorf:
Übrigens in deiner Beispiel Batch ist Zeile 9 mit goto END so überflüssig wie Essen gehen nach einen üppigen Gala Dinner.Deine Batch geht doch ganz alleine nach :END.
Übrigens in deiner Beispiel Batch ist Zeile 9 mit goto END so überflüssig wie Essen gehen nach einen üppigen Gala Dinner.Deine Batch geht doch ganz alleine nach :END.
Das mag bei dem Beispiel, auf das sich Peter bezieht, stimmen. Aber in Bezug auf deine ursprüngliche Prozedur bin ich anderer Meinung. Natürlich ist dort das letzte GOTO nicht nötig, aber ich finde, dass die identischen Verarbeitungsblöcke das mehr als aufwiegen. Dann kannst du die nämlich beliebig verschieben oder neue einfügen, ohne dass die Steuerung kaputt geht.
Gruß vom
WinCobold