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.
Danke.
Seid doch bitte so nett und findet meinen Fehler.
Danke Euch.
lg.
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.
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 206149
Url: https://administrator.de/forum/batch-script-mit-for-und-if-aktualisiert-timestamps-nicht-und-gibt-errorlevel-meldungen-im-logfile-nicht-aus-206149.html
Ausgedruckt am: 03.04.2025 um 01:04 Uhr
12 Kommentare
Neuester Kommentar
Hallo bella-it,
schalte doch bitte nachträglich die Codeformatierungen ein
Dann solltest Du in der zweiten Zeile setzen. Dann sollte es funktionieren.
Unser BatchSpezialist @bastla hat betimmt weitere Verbesserungsvorschläge.
Gruss Penny.
schalte doch bitte nachträglich die Codeformatierungen ein
Dann solltest Du in der zweiten Zeile
Setlocal ENABLEDELAYEDEXPANSION
Unser BatchSpezialist @bastla hat betimmt weitere Verbesserungsvorschläge.
Gruss Penny.
Hallo bella-it,
mach am Anfang deines Scripts folgende Zeile:
und schreibe deine Timestamps und andere Variablen innerhalb der FOR-Schleife eingeschlossen mit Ausrufezeichen:
siehe dazu auch http://ss64.com/nt/delayedexpansion.html
Grüße Uwe
mach am Anfang deines Scripts folgende Zeile:
setlocal ENABLEDELAYEDEXPANSION
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
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.
sieht doch viel besser aus, findest Du nicht?
Und für die Ausgabe kannst du es genauso machen
Gruss Penny.
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.
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?
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.
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
Tutorial zur FOR-Schleife
Gut, scheinbar funktioniert das mit dem #toc nicht mehr wie früher ... schau mal dort unter
FOR-Schleifen und GOTO