rf1986
Goto Top

Problem bei BAT fuer monatl. Archivierung

Hallo. Ich hoffe, jemand findet den Fehler.

Das folgende Script soll am 1. Tag eines jeden Monats ausgeführt werden und
Dateien in einen Ordner verschieben, der mit dem Datum des Vormonats benannt ist.

Eigentlich klappt das auch wie ich es mir vorstelle, ABER:
Beim Testen hab ich u.a. versucht, am 1. August und 1. September ein Backup zu erstellen.
Alle anderen Monate machen keine Probleme.
Eigentlich müssten ja "Archiv\2008-07" und "Archiv\2008-08" erstellt werden.
Es wird aber jeweils "Archiv\2007-12" erstellt.

@echo off
setlocal
rem Datum auslesen
set tag=%date:~-10,2%
set monat=%date:~-7,2%
set jahr=%date:~-4%
set stunde=%time:~-11,2%
if %stunde% LSS 10 set stunde=0%time:~-10,1%
set minute=%time:~-8,2%
set sekunde=%time:~-5,2%

set /a tag-=1
if %tag% LEQ 0 set /a monat-=1
if %monat% LEQ 0 set /a jahr-=1 & set monat=12

if %tag% GEQ 1 goto :done
rem Tag im Vormonat, Tag anpassen
if %monat% EQU 1 set tag=31
if %monat% EQU 3 set tag=31
if %monat% EQU 4 set tag=30
if %monat% EQU 5 set tag=31
if %monat% EQU 6 set tag=30
if %monat% EQU 7 set tag=31
if %monat% EQU 8 set tag=31
if %monat% EQU 9 set tag=30
if %monat% EQU 10 set tag=31
if %monat% EQU 11 set tag=30
if %monat% EQU 12 set tag=31

if %monat% NEQ 2 goto :done
rem Tag im Februar, Schaltjahr pruefen
set /a mod4=jahr % 4
set /a mod100=jahr % 100
set /a mod400=jahr % 400
set tag=28
if %mod4% NEQ 0 goto :done
set tag=29
if %mod100% NEQ 0 goto :done
set tag=28
if %mod400% NEQ 0 goto :done
set tag=29
:done

if %monat% LSS 10 set monat=0%monat%
if %tag% LSS 10 set monat=0%tag%

echo Die Dateien des Vormonats werden archiviert
echo Ermitteltes Datum: %tag%.%monat%.%jahr%, %stunde%:%minute%:%sekunde% Uhr

xcopy "D:\test\*.*" "D:\archiv\%jahr%-%monat%\*.*"/Q  
del "D:\test\*.*"/Q  
echo Fertig! Das Fenster wird gleich geschlossen
sleep 120
exit

Content-Key: 77123

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

Printed on: April 19, 2024 at 01:04 o'clock

Member: erik87
erik87 Jan 03, 2008 at 15:13:41 (UTC)
Goto Top
hallo,

also hab jetzt mal eben überflogen und gesehen das du die variable %monat% 2.mal deklarierst! vllt. liegt da ja der fehler

Zitat aus deinem script:

:done

if %monat% LSS 10 set monat=0%monat%
if %tag% LSS 10 set monat=0%tag%

echo Die Dateien des Vormonats werden archiviert
Member: Biber
Biber Jan 03, 2008 at 15:25:58 (UTC)
Goto Top
Moin RF1986,

es liegt daran, dass Dir die zweistelligen %tag%- und %monat%-Werte "08" und "09" als Oktalwerte interpretiert werden.
Bzw. (siehe Hilfe zu SET -- SET /a) alle "Werte", die mit einer Ziffer "0" beginnen, werden als "Oktal" angenommen.
Bei 01 bis 07 passt das - die entsprechen auch einem dezimalen 1 bis 7.
08 und 09 führen zu Fehlern.

Eine Möglichkeit der Umgehung wäre:
...
set /a tag=1%date:~-10,2% -100
set /a monat=1%date:~-7,2% -100
...

...also bei einem Datum "01.08.2007" -->
...
set /a tag=101 -100 ---> 1
set /a monat=108 -100 --> 8
...

-oder- (noch suboptimalere Variante)

Sicherstellen, dass NIE mit den "08"/"09"-Werten "gerechnet wird, sondern immer nur ein Textvergleich bei "IF...==" gemacht wird.
Für zweite Variante kein Beispiel, weil.... wer sollte so etwas tun?

Grüße
Biber
Member: Biber
Biber Jan 22, 2008 at 10:38:35 (UTC)
Goto Top
Moin RF1986,

ist deine Frage noch offen oder erledigt?

Grüße
Biber
Member: RF1986
RF1986 Feb 25, 2008 at 19:01:03 (UTC)
Goto Top
ist erledigt, vielen dank an Euch!