bella-it
Goto Top

Batch Script mit FOR und IF aktualisiert Timestamps nicht und gibt ERRORLEVEL Meldungen im LogFile nicht aus.

Liebes Team,
habe ein Script, dass mich schon länger quält. Ziel ist auf Grund einer Verzeichnisstruktur mit robocopy Daten von DirA nach DirB zu kopieren und dabei die Dauer und ein paar andere Inforamtionen zu erfassen.
Das Problem: TimeStamp ist nur beim Start und Ende richtig alle Durchläufe dazwischen haben die Startzeit und die ERRORLEVELmsg wird gar nicht ins Log geschrieben.
Bin nicht der Batchprofi, also bitte um Geduld mit mir. face-wink Danke.
Seid doch bitte so nett und findet meinen Fehler.
Danke Euch.
lg.

@echo off
set srcpath=%1
set dstpath=%2
set server=
set srcdir=%srcpath:~-8,8%
set dstdir=%dstpath:~-8,8%
REM Wochentag bestimmen:  robocopy /? |find "Gestartet"  ergibt:  Gestartet : Tue Feb 12 22:10:06 2008  
for /f "tokens=2" %%i in ('robocopy /?^|find "Gestartet"') do (  
    IF "%%i" == "Mon" set "woTag=1-Mo"  
    IF "%%i" == "Tue" set "woTag=2-Di"  
    IF "%%i" == "Wed" set "woTag=3-Mi"  
    IF "%%i" == "Thu" set "woTag=4-Do"  
    IF "%%i" == "Fri" set "woTag=5-Fr"  
    IF "%%i" == "Sat" set "woTag=6-Sa"  
    IF "%%i" == "Sun" set "woTag=7-So"  
)
rem Timestamp erzeugen
set year=%date:~-4%
set month=%date:~-7,2%
set day=%date:~-10,2%
set tag=%WoTag:~-2%
set hour=%TIME:~-11,2%
set minute=%TIME:~-8,2%
set dateofbackup=%year%-%month%-%day%-%tag%
set backuplogpath="%dstpath%\%dateofbackup%_copy.log"  
dir /b %srcpath%\*. >list.txt
echo ### > %backuplogpath%
for /f "usebackq tokens=1" %%a in ("C:\scripts\list.txt") do (  
echo ### %date% %time:~-11,8%  Start Kopieren %%a von %srcdir% nach %dstdir%! ### >> %backuplogpath%
echo. >> %backuplogpath%
echo ### %date% %time:~-11,8%  Kopiere Vollsicherung System Nutzdaten DB Backup von %%a! ### >> %backuplogpath%
echo robocopy %srcpath%\%%a\ %dstpath%\%%a\ /MIR /R:1 /W:1 /XF *backup.log *.ost /XD "zlogs" "*RECYCL*" "Otb" "Papierkorb"  
echo Pause in schleife bei Server %%a
rem pause
robocopy %srcpath%\%%a\ %dstpath%\%%a\ /MIR /R:1 /W:1 /XF *backup.log *.ost /XD "zlogs" "*RECYCL*" "Otb" "Papierkorb"  
set "msg=%errorlevel%"  
if "%msg%" == "16" echo ###### %date% %time:~-11,8%     ***FATAL ERROR*** ###### >> %backuplogpath% & goto FIN  
if "%msg%" == "8" echo ###### %date% %time:~-11,8%      **FAILED COPIES** ###### >> %backuplogpath% & goto FIN  
if "%msg%" == "4" echo ###### %date% %time:~-11,8%      *MISMATCHES* ###### >> %backuplogpath% & goto FIN  
if "%msg%" == "2" echo ###### %date% %time:~-11,8%      EXTRA FILES ###### >> %backuplogpath% & goto FIN  
if "%msg%" == "1" echo ###### %date% %time:~-11,8%      Copy successful ###### >> %backuplogpath% & goto FIN  
if "%msg%" == "0" echo ###### %date% %time:~-11,8%      –no change– ###### >> %backuplogpath% & goto FIN  
:FIN
echo %msg%
pause
set "errorlevel="  

echo. >> %backuplogpath%
echo ### %date% %time:~-11,8%  Ende Kopieren %%a von %srcdir% auf %dstdir%! ### >> %backuplogpath%
echo. >> %backuplogpath%
echo. >> %backuplogpath%
)

del list.txt /Q
echo. >> %backuplogpath%
echo. >> %backuplogpath%
echo ### %date% %time:~-11,8%  Ende Kopieren von %srcdir% auf %dstdir%! ### >> %backuplogpath%
rem
GOTO FINISH
:USAGE
cls
echo.
echo.
echo.
echo.            Eingabe:  copy.cmd  QuellPfad  ZielPfad
echo.
echo.
echo.
:FINISH

Content-Key: 206149

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

Ausgedruckt am: 28.03.2024 um 12:03 Uhr

Mitglied: Penny.Cilin
Penny.Cilin 07.05.2013 um 12:35:15 Uhr
Goto Top
Hallo bella-it,

schalte doch bitte nachträglich die Codeformatierungen ein

Dann solltest Du in der zweiten Zeile
 Setlocal ENABLEDELAYEDEXPANSION 
setzen. Dann sollte es funktionieren.

Unser BatchSpezialist @bastla hat betimmt weitere Verbesserungsvorschläge.


Gruss Penny.
Mitglied: colinardo
colinardo 07.05.2013 aktualisiert um 12:36:24 Uhr
Goto Top
Hallo bella-it,

mach am Anfang deines Scripts folgende Zeile:
setlocal ENABLEDELAYEDEXPANSION
und schreibe deine Timestamps und andere Variablen innerhalb der FOR-Schleife eingeschlossen mit Ausrufezeichen:
echo ### %date% !time:~-11,8! Kopiere Vollsicherung System Nutzdaten DB Backup von %%a! ### >> %backuplogpath%

siehe dazu auch http://ss64.com/nt/delayedexpansion.html

Grüße Uwe
Mitglied: bella-it
bella-it 07.05.2013 aktualisiert um 14:32:48 Uhr
Goto Top
Danke für die Hilfe.
Vorschläge umgesetzt, habe jetzt das Problem, dass die Schleife nach dem ersten Durchlauf endet.

Ausgabe:
  Beendet: Tue May 07 12:50:30 2013
ECHO ist ausgeschaltet (OFF).
Drücken Sie eine beliebige Taste . . .
Nach der Taste kommt das Prompt zurück.
Das hatte ich auch schon ein paar mal, konnte aber nicht wirklich herausfinden woran es lag, dass es einmal weiter ging und dann wieder nicht. Hatte den Eindruck, dass es mit Leerzeilen im Script zusammen hing.

Das Logfile sah mal so aus:
### 
### 04.05.2013 10:00:00  Start Kopieren bfsrv-01 von backup01 nach backup02! ### 
### 04.05.2013 10:00:00  Kopiere Vollsicherung System Nutzdaten DB Backup von bfsrv-01! ### 
### 04.05.2013 10:00:00  Ende Kopieren bfsrv-01 von backup01 auf backup02! ### 
 
 
### 04.05.2013 10:00:00  Start Kopieren bfsrv-02 von backup01 nach backup02! ### 
### 04.05.2013 10:00:00  Kopiere Vollsicherung System Nutzdaten DB Backup von bfsrv-02! ### 
### 04.05.2013 10:00:00  Ende Kopieren bfsrv-02 von backup01 auf backup02! ### 
 
 
### 04.05.2013 10:00:00  Start Kopieren bfsrv-03 von backup01 nach backup02! ### 
### 04.05.2013 10:00:00  Kopiere Vollsicherung System Nutzdaten DB Backup von bfsrv-03! ### 
### 04.05.2013 10:00:00  Ende Kopieren bfsrv-03 von backup01 auf backup02! ### 



mit den aktuellen Ändernungen:
### 
###  49:51 von  nach  ### 
 
###  49:51 ### 
######  49:51      –no change– ######  
 
###  50:40 ### 
 
 
 
 
###  50:40 ### 


und hier was ich gemacht habe:
@echo off
setlocal ENABLEDELAYEDEXPANSION
set srcpath=%1
set dstpath=%2
set server=
set srcdir=%srcpath:~-8,8%
set dstdir=%dstpath:~-8,8%
...
...
FOR /f "usebackq tokens=1" %%a in ("C:\scripts\list.txt") DO (  
echo ### !%date%! !%time:~-11,8%!  Start Kopieren %%a! von !%srcdir%! nach !%dstdir%! ### >> %backuplogpath%
echo. >> %backuplogpath%
echo ### !%date%! !%time:~-11,8%!  Kopiere Vollsicherung System Nutzdaten DB Backup von %%a! ### >> %backuplogpath%
echo robocopy %srcpath%\%%a\ %dstpath%\%%a\ /MIR /R:1 /W:1 /XF *backup.log *.ost /XD "zlogs" "*RECYCL*" "Otb" "Papierkorb"  
echo Pause in schleife bei Server %%a
rem pause
robocopy %srcpath%\%%a\ %dstpath%\%%a\ /MIR /R:1 /W:1 /XF *backup.log *.ost /XD "zlogs" "*RECYCL*" "Otb" "Papierkorb"  
set "msg=%errorlevel%"  
if "%msg%" == "16" echo ###### !%date%! !%time:~-11,8%!     ***FATAL ERROR*** ###### >> %backuplogpath% & goto FIN  
if "%msg%" == "8" echo ###### !%date%! !%time:~-11,8%!      **FAILED COPIES** ###### >> %backuplogpath% & goto FIN  
if "%msg%" == "4" echo ###### !%date%! !%time:~-11,8%!      *MISMATCHES* ###### >> %backuplogpath% & goto FIN  
if "%msg%" == "2" echo ###### !%date%! !%time:~-11,8%!      EXTRA FILES ###### >> %backuplogpath% & goto FIN  
if "%msg%" == "1" echo ###### !%date%! !%time:~-11,8%!      Copy successful ###### >> %backuplogpath% & goto FIN  
if "%msg%" == "0" echo ###### !%date%! !%time:~-11,8%!      –no change– ###### >> %backuplogpath% & goto FIN  
:FIN
echo !%msg%!
pause
set "errorlevel="  

echo. >> %backuplogpath%
echo ### !%date%! !%time:~-11,8%!  Ende Kopieren %%a von %srcdir% auf %dstdir%! ### >> %backuplogpath%
echo. >> %backuplogpath%
echo. >> %backuplogpath%
)
...
...

Danke.
lg.
tom
Mitglied: Penny.Cilin
Penny.Cilin 07.05.2013 um 13:07:20 Uhr
Goto Top
Hallo Tom,

nutze bitte die Möglichkeiten der Codeformatierungen. Damit ist dein Code und auch die Ausgabe besser lesbar.
Schau Dir den Link an, den ich in meiner ersten Antwort gesendet habe.

echo off
setlocal ENABLEDELAYEDEXPANSION
set srcpath=%1
set dstpath=%2
set server=
set srcdir=%srcpath:~-8,8%
set dstdir=%dstpath:~-8,8%
...
...
FOR /f "usebackq tokens=1" %%a in ("C:\scripts\list.txt") DO (  
echo ### !%date%! !%time:~-11,8%! Start Kopieren %%a! von !%srcdir%! nach !%dstdir%! ### >> %backuplogpath%
echo. >> %backuplogpath%
echo ### !%date%! !%time:~-11,8%! Kopiere Vollsicherung System Nutzdaten DB Backup von %%a! ### >> %backuplogpath%
echo robocopy %srcpath%\%%a\ %dstpath%\%%a\ /MIR /R:1 /W:1 /XF *backup.log *.ost /XD "zlogs" "*RECYCL*" "Otb" "Papierkorb"  
echo Pause in schleife bei Server %%a
rem pause
robocopy %srcpath%\%%a\ %dstpath%\%%a\ /MIR /R:1 /W:1 /XF *backup.log *.ost /XD "zlogs" "*RECYCL*" "Otb" "Papierkorb"  
set "msg=%errorlevel%"  
if "%msg%" == "16" echo ###### !%date%! !%time:~-11,8%! *FATAL ERROR* ###### >> %backuplogpath% & goto FIN  
if "%msg%" == "8" echo ###### !%date%! !%time:~-11,8%! FAILED COPIES ###### >> %backuplogpath% & goto FIN  
if "%msg%" == "4" echo ###### !%date%! !%time:~-11,8%! *MISMATCHES* ###### >> %backuplogpath% & goto FIN  
if "%msg%" == "2" echo ###### !%date%! !%time:~-11,8%! EXTRA FILES ###### >> %backuplogpath% & goto FIN  
if "%msg%" == "1" echo ###### !%date%! !%time:~-11,8%! Copy successful ###### >> %backuplogpath% & goto FIN  
if "%msg%" == "0" echo ###### !%date%! !%time:~-11,8%! –no change– ###### >> %backuplogpath% & goto FIN  
:FIN
echo !%msg%!
pause
set "errorlevel="  

echo. >> %backuplogpath%
echo ### !%date%! !%time:~-11,8%! Ende Kopieren %%a von %srcdir% auf %dstdir%! ### >> %backuplogpath%
echo. >> %backuplogpath%
echo. >> %backuplogpath%
)
...
...

sieht doch viel besser aus, findest Du nicht?
Und für die Ausgabe kannst du es genauso machen


Gruss Penny.
Mitglied: bella-it
bella-it 07.05.2013 aktualisiert um 13:11:13 Uhr
Goto Top
Hallo Penny,
habe das gelesen aber nicht gefunden wo ich das einschalte.
muß ich jede Zeile editieren wie das dort beschrieben war?


Inzwischen ahbe ich verstanden, dass die "!" die "%" ersetzen sollen. Ist das richtig?

Danke

LG.
tom
Mitglied: Penny.Cilin
Penny.Cilin 07.05.2013 um 13:31:44 Uhr
Goto Top
Zitat von @bella-it:
Hallo Penny,
habe das gelesen aber nicht gefunden wo ich das einschalte.
muß ich jede Zeile editieren wie das dort beschrieben war?

Nein, wenn du Dir den Beitrag mal genau anschaust, dann siehst Du ein Beispiel. Du brauchst nur am Anfang und am Ende die Tags für die Formatierung. Wenn innerhalb der Tags mehrere zielen sind, werden die Zeilennummern automatisch erstellt. Wenn Du keine Zeilennummern haben willst, scghau Dir die Erläuterung bei PLAIN an.

Was ich mich frage, ist warum Du zuerst SRCPATH und DSTPATH setzt und dann in SRCDIR und DSTDIR auflöst.


Gruss Penny.
Mitglied: bella-it
bella-it 07.05.2013 aktualisiert um 14:36:59 Uhr
Goto Top
Hallo Penny,

das mit der Formatierung habe ich jetzt geschafft.

Dieses Script läuft zu verschieden Zeiten (Woche 1,...,Woche 4) Dabei ändert sich immer im Aufruf SRC- und DSTPath.

SRC- / DSTDir sind dann die jeweiligen Quell- und Zielunterverzeichnisse.


@echo off
setlocal ENABLEDELAYEDEXPANSION
set srcpath=%1
set dstpath=%2
set server=
set srcdir=%srcpath:~-8,8%
set dstdir=%dstpath:~-8,8%
REM Wochentag bestimmen:  robocopy /? |find "Gestartet"  ergibt:  Gestartet : Tue Feb 12 22:10:06 2008  
for /f "tokens=2" %%i in ('robocopy /?^|find "Gestartet"') do (  
    IF "%%i" == "Mon" set "woTag=1-Mo"  
    IF "%%i" == "Tue" set "woTag=2-Di"  
    IF "%%i" == "Wed" set "woTag=3-Mi"  
    IF "%%i" == "Thu" set "woTag=4-Do"  
    IF "%%i" == "Fri" set "woTag=5-Fr"  
    IF "%%i" == "Sat" set "woTag=6-Sa"  
    IF "%%i" == "Sun" set "woTag=7-So"  
)
rem Timestamp erzeugen
set year=%date:~-4%
set month=%date:~-7,2%
set day=%date:~-10,2%
set tag=%WoTag:~-2%
set hour=%TIME:~-11,2%
set minute=%TIME:~-8,2%
set dateofbackup=%year%-%month%-%day%-%tag%
set backuplogpath="%dstpath%\%dateofbackup%_copy.log"  
dir /b %srcpath%\*. >list.txt
echo ### > %backuplogpath%

FOR /f "usebackq tokens=1" %%a in ("C:\scripts\list.txt") DO (  
echo ### !date! !time:~-11,8!  Start Kopieren %%a von %srcdir% nach %dstdir%. ### >> %backuplogpath%
echo. >> %backuplogpath%
echo ### !date! !time:~-11,8!  Kopiere Vollsicherung System Nutzdaten DB Backup von %%a. ### >> %backuplogpath%
echo robocopy %srcpath%\%%a\ %dstpath%\%%a\ /MIR /R:1 /W:1 /XF *backup.log *.ost /XD "zlogs" "*RECYCL*" "Otb" "Papierkorb"  
robocopy %srcpath%\%%a\ %dstpath%\%%a\ /MIR /R:1 /W:1 /XF *backup.log *.ost /XD "zlogs" "*RECYCL*" "Otb" "Papierkorb"  
set "msg=!errorlevel!"  
if "!msg!" == "16" echo ### !date! !time:~-11,8!     ***FATAL ERROR*** ###### >> %backuplogpath% & goto FIN  
if "!msg!" == "8" echo ### !date! !time:~-11,8!      **FAILED COPIES** ###### >> %backuplogpath% & goto FIN  
if "!msg!" == "4" echo ### !date! !time:~-11,8!      *MISMATCHES* ###### >> %backuplogpath% & goto FIN  
if "!msg!" == "2" echo ### !date! !time:~-11,8!      EXTRA FILES ###### >> %backuplogpath% & goto FIN  
if "!msg!" == "1" echo ### !date! !time:~-11,8!      Copy successful ###### >> %backuplogpath% & goto FIN  
if "!msg!" == "0" echo ### !date! !time:~-11,8!      –no change– ###### >> %backuplogpath% & goto FIN  
:FIN
set "errorlevel="  
echo ### !date! !time:~-11,8!  Ende Kopieren %%a von %srcdir% auf %dstdir%. ### >> %backuplogpath%
echo. >> %backuplogpath%
echo. >> %backuplogpath%
pause
)
del list.txt /Q
echo ### !date! !time:~-11,8!  Ende Kopieren von %srcdir% auf %dstdir% ### >> %backuplogpath%
GOTO FINISH
:FINISH

liefert folgendes Logfile:
### 
### 07.05.2013 13:32:21  Start Kopieren bfsrv-01 von backup01 nach Backup02. ### 
 
### 07.05.2013 13:32:21  Kopiere Vollsicherung System Nutzdaten DB Backup von ##green|bfsrv-01.## ### 
### 07.05.2013 13:32:24      EXTRA FILES ######  
### 07.05.2013 13:32:24  Ende Kopieren ##red|%a## von backup01 auf Backup02. ### 
 
### 07.05.2013 13:32:25  Ende Kopieren von backup01 auf Backup02 ### 

Meine Fragen dazu:

- warum bleibt die Schleife nach "Pause" (Zeile 48 Script) drücken einer Taste stehen
- warum wird bei "Ende Kopieren %%a ..." (Zeile 6 Logfile) der Servername nicht mehr wiedergegeben.

PS.: was habe ich falsch gemacht, dass die Farben nicht kommen?

Danke für eure Hilfe.

Lg.
tom
Mitglied: Penny.Cilin
Penny.Cilin 07.05.2013 um 14:16:53 Uhr
Goto Top

PS.: was habe ich falsch gemacht, dass die Farben nicht kommen?


Wo hast Du denn die Farben definiert? Übersehe ich da etwas?
ich würde jetzt erwaren, daß
Set ErrColor=4E
Set WARNColor=E4
...
...

Echo %ErrColor$ <meldungstext>

irgendwo definiert und dann angesprochen werden.

Gruss Penny.
Mitglied: bella-it
bella-it 07.05.2013 um 14:27:48 Uhr
Goto Top
Hallo Penny,

ich habe beim Ausgabe code versucht die Fehler färbig hervorzuheben:

... bfsrv-01.
... %a

hat jetzt nichts mit dem Script zu tun.

LG.

tom
Mitglied: bella-it
bella-it 07.05.2013 aktualisiert um 15:11:33 Uhr
Goto Top
Hallo,

habe das Problem gefunden:
habe die GOTO Anweisung in den Zeilen 37 - 42 entfernt.
jetzt läuft das Script. juhu!!

Kann mir vielleicht noch wer erklären warum man das nicht darf? GOTO in einer FOR Anweisung?

Danke für eure Unterstützung.

Lg.
tom
Mitglied: Skyemugen
Skyemugen 07.05.2013 aktualisiert um 16:31:27 Uhr
Goto Top
Nicht darf, tja, hm, da gibt es doch so ein schönes Tutorial bei uns ;)
Tutorial zur FOR-Schleife

Gut, scheinbar funktioniert das mit dem #toc nicht mehr wie früher ... schau mal dort unter FOR-Schleifen und GOTO
Mitglied: bella-it
bella-it 07.05.2013 um 16:40:01 Uhr
Goto Top
Hallo Skyemugen,

danke für Deinen Hinweis, werde ich bei nächster Gelegenheit lesen, da ich auch noch einige andere Batch-Projekte vor mir habe.

LG.

tom