37414
Goto Top

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... face-smile

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

Content-Key: 574082

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

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

Member: Xerebus
Xerebus May 21, 2020 at 17:04:52 (UTC)
Goto Top
Wo sollte die dann sonst sein?
Dann ersetze doch goto end mit goto start und füge oben ein :start ein.
Mitglied: 37414
37414 May 21, 2020 at 17:59:06 (UTC)
Goto Top
Danke Dir für Deine Antwort.

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).

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.

Unten ist ja auch eine "pause" eingetragen, sodass die Menü-Batch auf jeden Fall offen bleiben sollte.
Oder habe ich da was falsch verstanden?

Gruß,
imebro
Member: Pjordorf
Pjordorf May 21, 2020 at 18:24:30 (UTC)
Goto Top
Hallo,

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?

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
Member: Lochkartenstanzer
Lochkartenstanzer May 21, 2020 updated at 19:04:00 (UTC)
Goto Top
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
Mitglied: 37414
37414 May 22, 2020 updated at 13:57:36 (UTC)
Goto Top
Hmmm... verstehe ich nicht.

OK, der Hinweis auf "von vorne anfangen" war verwirrend und nicht korrekt.
Ich zeige es nochmal an einer ganz einfachen Batchdatei:

@ echo off &setlocal

set Quelle="D:\Desktop\Test"  
set Ziel="E:\Test"  
set Logfile="D:\Desktop\BACKUP\Robocopy-Logs\Batch-Vorlage_LOG.txt"  

robocopy %Quelle% %Ziel% /MIR /NP /DST /MT:4 /R:3 /W:10 /LOG:%Logfile% > Nul

goto END

:END
echo Sicherung beendet!
pause

Hier wird kopiert und direkt danach erscheint im CMD-Fenster die Meldung "Sicherung beendet!" sowie darunter der Hinweis "drücken Sie eine beliebige Taste...".

Letzteres wird ja durch den Eintrag "pause" in der Batch verursacht. Richtig so?

Nun hatte ich folgendes angenommen (und das ist für mich auch jetzt noch logisch):
- ich rufe innerhalb der obigen Batch (Batch 1) nun eine weitere Batch per Call-Befehl auf (nennen wir sie Batch 2).
- nachdem Batch 2 nun in einem neuen CMD-Fenster geöffnet und danach abgearbeitet wurde, schließt sich Batch 2 (per "EOF").
- 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? face-wink

Gruß,
imebro
Member: Pjordorf
Pjordorf May 22, 2020 at 15:45:16 (UTC)
Goto Top
Hallo,

Zitat von @37414:
Hmmm... verstehe ich nicht.
Batch ist schon 40 Jahre alt und ar älter.

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? face-wink
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 Kommandos
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
Mitglied: 37414
37414 May 22, 2020 updated at 17:45:44 (UTC)
Goto Top
Das ist ja alles sehr schön, was Du schreibst.

Aber erkläre mir doch bitte mal, wieso - nachdem Batch 2 abgeschlossen ist - es nicht mehr bei Batch 1 weitergeht?

Hier mal 2 neue und ganz einfach Beispiele:

Batch1
@ echo off &setlocal

set Quelle="D:\Desktop\Test"  
set Ziel="E:\Test"  

robocopy %Quelle% %Ziel% /MIR 

call batch2.bat

echo Sicherung beendet!
pause

Batch2
@ echo off &setlocal

set Quelle="D:\Desktop\blabla"  
set Ziel="E:\blabla"  

robocopy %Quelle% %Ziel% /MIR 

:EOF

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?

Gruß,
imebro
Member: Lochkartenstanzer
Solution Lochkartenstanzer May 22, 2020 updated at 17:55:01 (UTC)
Goto Top
Zitat von @37414:

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
Member: Pjordorf
Solution Pjordorf May 22, 2020 at 19:02:16 (UTC)
Goto Top
Hallo,

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 ...

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.

Gruß,
Peter
Mitglied: 37414
37414 May 22, 2020 at 19:56:45 (UTC)
Goto Top
Ich habe es jetzt wie folgt gelöst und das funktioniert auch:

Batch1
@ echo off &setlocal

:START
cls

echo Auswahl 1
echo Auswahl 2
echo Auswahl 3

set Quelle="D:\Desktop\Test"  
set Ziel="E:\Test"  

robocopy %Quelle% %Ziel% /MIR 

call batch2.bat
goto START

echo Sicherung beendet!
pause

Batch2
@ echo off &setlocal

set Quelle="D:\Desktop\blabla"  
set Ziel="E:\blabla"  

robocopy %Quelle% %Ziel% /MIR 

exit /b

Wenn Batch2 per "exit /b" beendet ist, springt sie sofort zu Batch1 zu "START", leert dann das Fenster (cls) und dann habe ich wieder das Menü vor mir, wo ich eine Auswahl treffen kann (habe in der Batch jetzt den ganzen Code bezügl. Auswahl weggelassen).

Funktioniert also so. 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.

Gruß,
imebro
Member: Lochkartenstanzer
Lochkartenstanzer May 22, 2020 updated at 20:01:35 (UTC)
Goto Top
Zitat von @37414:

Funktioniert also so.

Dann fehlt nur noch How can I mark a post as solved?

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
Member: WinCobold
WinCobold May 23, 2020 at 11:08:02 (UTC)
Goto Top
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
Mitglied: 37414
37414 May 23, 2020 at 17:36:43 (UTC)
Goto Top
Danke Dir für Deine Tipps.

Das mit dem "Exit /b" hatte ich nur gemacht, da mir das weiter oben ja von 2 Usern empfohlen wurde.
Am Ende ist es ja wahrscheinlich auch egal. Die Batch funktioniert ja so und daher ist es ja ok.
Oder denkst Du es wäre korrekter (besser), das "Exit /b" durch ein "EOF" oder "goto :EOF" etc. zu ersetzen?

Mit den Fenstern ist tatsächlich so.
Ich hatte einfach nur angenommen, dass sich ein 2. Fenster öffnen würde nach Call. War einfach nur für mich logisch face-smile

Mit dem Setlocal am Anfang das hatte ich einfach aus meiner Batchvorlage übernommen und es nicht abgeändert. Sollte ich das durch ein normales "@ echo off" ersetzen? Und wenn ja... warum?

Gruß,
imebro
Member: WinCobold
WinCobold May 24, 2020 at 11:35:57 (UTC)
Goto Top
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

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.

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
Mitglied: 37414
37414 May 24, 2020 at 11:52:35 (UTC)
Goto Top
OK, habe ich verstanden.

Dann lasse ich es jetzt so, wie es ist und so funktioniert es ja auch.

Danke für Deine Hilfe und auch an alle anderen Helfer face-wink

Gruß,
imebro