rw2000
Goto Top

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

Content-Key: 135278

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

Ausgedruckt am: 29.03.2024 um 07:03 Uhr

Mitglied: 5t8d1e
5t8d1e 05.02.2010 um 17:45:46 Uhr
Goto Top
Hallo,

meines Erachten nach ist deine Denkweise etwas schräg. Wie soll der cmd-Interpreter eine Sprungmarke finden wenn diese nicht vorhanden ist?

The system cannot find the batch label specified - ROBOCOPY_LOOP_1 sagt ja alles aus oder?

Grüße Torsten
Mitglied: miniversum
miniversum 05.02.2010 um 17:51:35 Uhr
Goto Top
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
Mitglied: bastla
bastla 05.02.2010 um 18:14:31 Uhr
Goto Top
... wobei sich dann das Unterprogramm noch auf
:warten
TASKLIST|FINDSTR /I ROBOCOPY.EXE>NUL && goto:warten
goto:eof
reduzieren ließe (und wenn danach nix mehr kommt, reichen die ersten beiden Zeilen face-wink).

Auf jeden Fall hat miniversum die mE sinnvollste Variante gezeigt ...

Grüße
bastla
Mitglied: laster
laster 06.02.2010 um 13:32:02 Uhr
Goto Top
Hallo,

wenn Du schon mit start arbeitest, kannst Du doch die Option /WAIT nutzen?

vG LS
Mitglied: bastla
bastla 06.02.2010 um 14:35:46 Uhr
Goto Top
... klingt sinnvoll - um den derzeitigen Ablauf nachzubilden, müsste allerdings abzuschätzen sein, welcher der parallel laufenden Vorgänge am längsten dauert (um nur diesen als letzten Befehl des Blocks mit "/wait" aufzurufen) ...

Grüße
bastla
Mitglied: Biber
Biber 06.02.2010 um 15:05:40 Uhr
Goto Top
... 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]
Mitglied: rw2000
rw2000 08.02.2010 um 10:06:11 Uhr
Goto Top
hallo leute,

vielen dank fuer die zahlreichen antworten.

@ thorsten: die sprungmarke ist ja zu diesem zeitpunkt schon vorhanden, da ich sie ja mit IF "%NUMBER%" == "" SET NUMBER=1 setze. wird mir auch angezeigt wenn ich REM :ROBOCOPY_LOOP_%NUMBER% angebe.
trotzdem findet der batch sie nicht. womoeglich ist da eher die denkweise von microsoft schraeg. egal.

@ laster: start /wait bringt ja nix, weil ich mehrere gleichzeitig starten will und mit /wait wartet er ja zwangslaeufig, bis der vorgaenger beendet ist.

@ biber: logs will ich keine erzeugen, insofern scheidet das aus. threads ist eigentlich das stichwort, denn mit windows 7 kann robocopy multi-threads ausfuehren. dann koennt ich mir das ganze sparen. muss aber unter xp laufen.

@ miniversum und bastla: eure vorschlaege scheinen die loesung zu sein. dass ich mir im batch so eine art subroutinen basteln kann wusste ich bis jetzt nicht. man lernt nie aus.

so long

rainer