GOTO label automatisch hochzaehlen
hallo leute,
ich bin neu hier in diesem klasse forum, das mir schon oft weiter geholfen hat. jetzt stehe ich mit einem problem aber ziemlich auf dem schlauch.
ich habe folgendes vor:
ich starte mehrere robocopy-jobs gleichzeitig und warte, bis alle beendet sind (sprich, bis alle robocopy.exe-prozesse weg sind), dann gehts weiter
mit den naechsten jobs, warten, naechste jobs usw.
das klappt soweit auch prima mit diesem code:
REM Hier werden mehrere RoboCopy's gestartet, den genauen Aufruf spar ich mir hier mal
START /B ROBOCOPY.EXE ...
START /B ROBOCOPY.EXE ...
START /B ROBOCOPY.EXE ...
START /B ROBOCOPY.EXE ...
REM Der folgende Loop soll auf die Beendigung der RoboCopy's warten ...
:ROBOCOPY_LOOP_1
TASKLIST | FINDSTR /I ROBOCOPY.EXE > NUL
IF %ERRORLEVEL% == 0 GOTO ROBOCOPY_LOOP_1 > NUL
REM Hier werden mehrere RoboCopy's gestartet, den genauen Aufruf spar ich mir hier mal
START /B ROBOCOPY.EXE ...
START /B ROBOCOPY.EXE ...
START /B ROBOCOPY.EXE ...
START /B ROBOCOPY.EXE ...
REM Der folgende Loop soll auf die Beendigung der RoboCopy's warten ...
:ROBOCOPY_LOOP_2
TASKLIST | FINDSTR /I ROBOCOPY.EXE > NUL
IF %ERRORLEVEL% == 0 GOTO ROBOCOPY_LOOP_2 > NUL
REM Hier werden mehrere RoboCopy's gestartet, den genauen Aufruf spar ich mir hier mal
START /B ROBOCOPY.EXE ...
START /B ROBOCOPY.EXE ...
START /B ROBOCOPY.EXE ...
START /B ROBOCOPY.EXE ...
REM Der folgende Loop soll auf die Beendigung der RoboCopy's warten ...
:ROBOCOPY_LOOP_3
TASKLIST | FINDSTR /I ROBOCOPY.EXE > NUL
IF %ERRORLEVEL% == 0 GOTO ROBOCOPY_LOOP_3 > NUL
REM usw. ...
wie man sehen kann, habe ich die labels fuer die goto-befehle hier 'fest verdrahtet', was zwar wie gesagt funktioniert, aber etwas unelegant ist.
deshalb habe ich versucht, den zaehler, den ich an dem sprungziel mit dran habe, automatisch hochzuzaehlen:
REM Hier werden mehrere RoboCopy's gestartet, den genauen Aufruf spar ich mir hier mal
START /B ROBOCOPY.EXE ...
START /B ROBOCOPY.EXE ...
START /B ROBOCOPY.EXE ...
START /B ROBOCOPY.EXE ...
REM Der folgende Loop soll auf die Beendigung der RoboCopy's warten ...
IF "%NUMBER%" == "" SET NUMBER=1
:ROBOCOPY_LOOP_%NUMBER%
TASKLIST | FINDSTR /I ROBOCOPY.EXE > NUL
IF %ERRORLEVEL% == 0 GOTO ROBOCOPY_LOOP_%NUMBER% > NUL
SET /A NUMBER=%NUMBER%+1
REM Hier werden mehrere RoboCopy's gestartet, den genauen Aufruf spar ich mir hier mal
START /B ROBOCOPY.EXE ...
START /B ROBOCOPY.EXE ...
START /B ROBOCOPY.EXE ...
START /B ROBOCOPY.EXE ...
REM Der folgende Loop soll auf die Beendigung der RoboCopy's warten ...
IF "%NUMBER%" == "" SET NUMBER=1
:ROBOCOPY_LOOP_%NUMBER%
TASKLIST | FINDSTR /I ROBOCOPY.EXE > NUL
IF %ERRORLEVEL% == 0 GOTO ROBOCOPY_LOOP_%NUMBER% > NUL
SET /A NUMBER=%NUMBER%+1
REM Hier werden mehrere RoboCopy's gestartet, den genauen Aufruf spar ich mir hier mal
START /B ROBOCOPY.EXE ...
START /B ROBOCOPY.EXE ...
START /B ROBOCOPY.EXE ...
START /B ROBOCOPY.EXE ...
REM Der folgende Loop soll auf die Beendigung der RoboCopy's warten ...
IF "%NUMBER%" == "" SET NUMBER=1
:ROBOCOPY_LOOP_%NUMBER%
TASKLIST | FINDSTR /I ROBOCOPY.EXE > NUL
IF %ERRORLEVEL% == 0 GOTO ROBOCOPY_LOOP_%NUMBER% > NUL
SET /A NUMBER=%NUMBER%+1
REM usw. ...
ABER: irgendwie erkennt das script das sprungziel nicht mehr, es kommt schon nach der ersten schleife die fehlermeldung:
The system cannot find the batch label specified - ROBOCOPY_LOOP_1
so, hab ich hier nur noch ein kleines syntax-problem, auf das ich einfach nicht komme oder womoeglich doch einen groesseren denkfehler?
wer kann mir helfen?
vielen dank im voraus ...
so long
rainer
ich bin neu hier in diesem klasse forum, das mir schon oft weiter geholfen hat. jetzt stehe ich mit einem problem aber ziemlich auf dem schlauch.
ich habe folgendes vor:
ich starte mehrere robocopy-jobs gleichzeitig und warte, bis alle beendet sind (sprich, bis alle robocopy.exe-prozesse weg sind), dann gehts weiter
mit den naechsten jobs, warten, naechste jobs usw.
das klappt soweit auch prima mit diesem code:
REM Hier werden mehrere RoboCopy's gestartet, den genauen Aufruf spar ich mir hier mal
START /B ROBOCOPY.EXE ...
START /B ROBOCOPY.EXE ...
START /B ROBOCOPY.EXE ...
START /B ROBOCOPY.EXE ...
REM Der folgende Loop soll auf die Beendigung der RoboCopy's warten ...
:ROBOCOPY_LOOP_1
TASKLIST | FINDSTR /I ROBOCOPY.EXE > NUL
IF %ERRORLEVEL% == 0 GOTO ROBOCOPY_LOOP_1 > NUL
REM Hier werden mehrere RoboCopy's gestartet, den genauen Aufruf spar ich mir hier mal
START /B ROBOCOPY.EXE ...
START /B ROBOCOPY.EXE ...
START /B ROBOCOPY.EXE ...
START /B ROBOCOPY.EXE ...
REM Der folgende Loop soll auf die Beendigung der RoboCopy's warten ...
:ROBOCOPY_LOOP_2
TASKLIST | FINDSTR /I ROBOCOPY.EXE > NUL
IF %ERRORLEVEL% == 0 GOTO ROBOCOPY_LOOP_2 > NUL
REM Hier werden mehrere RoboCopy's gestartet, den genauen Aufruf spar ich mir hier mal
START /B ROBOCOPY.EXE ...
START /B ROBOCOPY.EXE ...
START /B ROBOCOPY.EXE ...
START /B ROBOCOPY.EXE ...
REM Der folgende Loop soll auf die Beendigung der RoboCopy's warten ...
:ROBOCOPY_LOOP_3
TASKLIST | FINDSTR /I ROBOCOPY.EXE > NUL
IF %ERRORLEVEL% == 0 GOTO ROBOCOPY_LOOP_3 > NUL
REM usw. ...
wie man sehen kann, habe ich die labels fuer die goto-befehle hier 'fest verdrahtet', was zwar wie gesagt funktioniert, aber etwas unelegant ist.
deshalb habe ich versucht, den zaehler, den ich an dem sprungziel mit dran habe, automatisch hochzuzaehlen:
REM Hier werden mehrere RoboCopy's gestartet, den genauen Aufruf spar ich mir hier mal
START /B ROBOCOPY.EXE ...
START /B ROBOCOPY.EXE ...
START /B ROBOCOPY.EXE ...
START /B ROBOCOPY.EXE ...
REM Der folgende Loop soll auf die Beendigung der RoboCopy's warten ...
IF "%NUMBER%" == "" SET NUMBER=1
:ROBOCOPY_LOOP_%NUMBER%
TASKLIST | FINDSTR /I ROBOCOPY.EXE > NUL
IF %ERRORLEVEL% == 0 GOTO ROBOCOPY_LOOP_%NUMBER% > NUL
SET /A NUMBER=%NUMBER%+1
REM Hier werden mehrere RoboCopy's gestartet, den genauen Aufruf spar ich mir hier mal
START /B ROBOCOPY.EXE ...
START /B ROBOCOPY.EXE ...
START /B ROBOCOPY.EXE ...
START /B ROBOCOPY.EXE ...
REM Der folgende Loop soll auf die Beendigung der RoboCopy's warten ...
IF "%NUMBER%" == "" SET NUMBER=1
:ROBOCOPY_LOOP_%NUMBER%
TASKLIST | FINDSTR /I ROBOCOPY.EXE > NUL
IF %ERRORLEVEL% == 0 GOTO ROBOCOPY_LOOP_%NUMBER% > NUL
SET /A NUMBER=%NUMBER%+1
REM Hier werden mehrere RoboCopy's gestartet, den genauen Aufruf spar ich mir hier mal
START /B ROBOCOPY.EXE ...
START /B ROBOCOPY.EXE ...
START /B ROBOCOPY.EXE ...
START /B ROBOCOPY.EXE ...
REM Der folgende Loop soll auf die Beendigung der RoboCopy's warten ...
IF "%NUMBER%" == "" SET NUMBER=1
:ROBOCOPY_LOOP_%NUMBER%
TASKLIST | FINDSTR /I ROBOCOPY.EXE > NUL
IF %ERRORLEVEL% == 0 GOTO ROBOCOPY_LOOP_%NUMBER% > NUL
SET /A NUMBER=%NUMBER%+1
REM usw. ...
ABER: irgendwie erkennt das script das sprungziel nicht mehr, es kommt schon nach der ersten schleife die fehlermeldung:
The system cannot find the batch label specified - ROBOCOPY_LOOP_1
so, hab ich hier nur noch ein kleines syntax-problem, auf das ich einfach nicht komme oder womoeglich doch einen groesseren denkfehler?
wer kann mir helfen?
vielen dank im voraus ...
so long
rainer
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 135278
Url: https://administrator.de/forum/goto-label-automatisch-hochzaehlen-135278.html
Ausgedruckt am: 22.04.2025 um 10:04 Uhr
7 Kommentare
Neuester Kommentar
Ich würde das anders lösen. Die Schleife fürs warten kannst du ja in eine unterprozedur packen die um immer wieder übe rein call aufrufst:
START /B ROBOCOPY.EXE ...
START /B ROBOCOPY.EXE ...
START /B ROBOCOPY.EXE ...
START /B ROBOCOPY.EXE ...
call:warten
START /B ROBOCOPY.EXE ...
START /B ROBOCOPY.EXE ...
START /B ROBOCOPY.EXE ...
START /B ROBOCOPY.EXE ...
call:warten
START /B ROBOCOPY.EXE ...
START /B ROBOCOPY.EXE ...
START /B ROBOCOPY.EXE ...
START /B ROBOCOPY.EXE ...
goto:eof
:warten
:ROBOCOPY_LOOP_1
TASKLIST | FINDSTR /I ROBOCOPY.EXE > NUL
IF %ERRORLEVEL% == 0 GOTO ROBOCOPY_LOOP_1 > NUL
... ich würde eher versuchen, die Anforderung konventionell zu lösen.
Wenn x Robocopy-"Threads" parallel gestartet werden sollen und der Batch-Ablauf erst weiterlaufen soll, wenn alle fertig sind..
Ja hey! Dann können doch alle Robocopy-Jobs jeweils ein "Robocopy_log.001"...bis "..007" schreiben und der Batch prüft,
ob "Robocopy_log.001" bis "..007" da sind.
Denn Protokoll-Dateien bei einem Kopier/Sicherungslauf will ich ja ohnehin haben.
[Um einen Einwand zu entkräften: Das Risiko, dass einer der Robocopy-Jobs derart in die Grütze geht, dass er keine Kraft mehr hat ein Log zu schreiben... das halte ich für zu vernachlässigen.]
Grüße
Biber
[Edit] Die Formulierung ob "Robocopy_log.001" bis "..007" da sind" sollte eigentlich noch etwas verfeinert werden.
Denn eine Log-Datei ist möglicherweise schon vorhanden, bevor Robocopy fertig (jedenfalls würde von mir geschriebenes Kopierprogramm auch nach jedem Teil-Erfolg etwas schreiben). Also sollte nicht nur mit IF EXIST geprüft werden, ob ein Log vorhanden ist, sondern mit Find/FindStr inhaltlich auf die Zeile "Summary"/Zusammenfassung oder whatever Robocopy so zum Schluss schreibt.
[/Edit]
Wenn x Robocopy-"Threads" parallel gestartet werden sollen und der Batch-Ablauf erst weiterlaufen soll, wenn alle fertig sind..
Ja hey! Dann können doch alle Robocopy-Jobs jeweils ein "Robocopy_log.001"...bis "..007" schreiben und der Batch prüft,
ob "Robocopy_log.001" bis "..007" da sind.
Denn Protokoll-Dateien bei einem Kopier/Sicherungslauf will ich ja ohnehin haben.
[Um einen Einwand zu entkräften: Das Risiko, dass einer der Robocopy-Jobs derart in die Grütze geht, dass er keine Kraft mehr hat ein Log zu schreiben... das halte ich für zu vernachlässigen.]
Grüße
Biber
[Edit] Die Formulierung ob "Robocopy_log.001" bis "..007" da sind" sollte eigentlich noch etwas verfeinert werden.
Denn eine Log-Datei ist möglicherweise schon vorhanden, bevor Robocopy fertig (jedenfalls würde von mir geschriebenes Kopierprogramm auch nach jedem Teil-Erfolg etwas schreiben). Also sollte nicht nur mit IF EXIST geprüft werden, ob ein Log vorhanden ist, sondern mit Find/FindStr inhaltlich auf die Zeile "Summary"/Zusammenfassung oder whatever Robocopy so zum Schluss schreibt.
[/Edit]