Per Batch Datum verändern

Weis vielleicht jemand wie man wenn man das Datum um 1 zurücksetz so wie hier

@echo OFF
echo Batch zum Datum aendern
set year=%date:~-4%
set month=%date:~-7,2%
set day=%date:~-10,2%
echo %day%.%month%.%year%
set /a day=%day%-1
date %day%.%month%.%year%
pause

wie ich es schreiben muss damit wenn wir den sagen wir mal 1.9.haben und er das datum zurücksetzt das er dann nicht den 0.9. draus macht sondern den 31.8 also acuh auf den Monat zurückspringt und nicht ne null mach sonder den letzen tag des Vormonats

hab so gut wie keine ahnung von batchdateinen hab also keine ahnung wie ich das anstellen könnte =)

Hallo.

Weis vielleicht jemand wie man wenn man das Datum um 1
zurücksetz so wie hier

@echo OFF
echo Batch zum Datum aendern
set year=%date:~-4%
set month=%date:~-7,2%
set day=%date:~-10,2%
echo %day%.%month%.%year%
set /a day=%day%-1
date %day%.%month%.%year%
pause

z.B. so:

@echo off
setlocal
rem Datum auslesen
set tag=%date:~-10,2%
set monat=%date:~-7:2%
set jahr=%date:~-4%

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 prüfen
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

date %tag%.%monat%.%jahr%

Sebastian.

Weiss vielleicht jemand wie man wenn man das Datum
um 1 zurücksetz so wie hier

Wenn Du Dir Perl installieren kannst,
dann schreibst Du Dir ein kleines Skript,
welches das zuverlässig macht:

 $tage = shift or die "Keine Differenz angegeben (-1 oder +3 oder so";
 ($sec,$min,$hour,$mday,$mon,$year) = localtime(time + ($tage \* 24\*60\*60));
 $tagneu = sprintf "%02d-%02d-%4d", $mday, $mon+1, $year+1900;
 system("cmd.exe /c date $tagneu") or print "$tagneu\n";

Der Ausdruck „time + ($tage * 24*60*60“ zieht praktisch
n Tage ab oder addiert sie dazu.

Obiges Skript speicherst Du als ‚tagdiff.pl‘ in c:\ ab
und kannst dann mit:

 @ECHO OFF
 ...
 perl tagdiff.pl +5
 ...

… das Datum aus einer Batch um 5 Tage vorstellen. Natürlich
annst Du auch mit ’ perl tagdiff.pl -200
um 200 Tage zurückstellen o.ä. :wink:

Grüße

CMБ

PS.: Perl kann man hier runterladen:
http://downloads.activestate.com/ActivePerl/Windows/…

Hallo danke an euch beide Sebastian dein funtioniert irgendwie nicht richtig er setz den tag nicht zurück wenn ich es so in eine txt kopiere und benutze.

an sich so wie das makro aussieht hast ja sogar mit schaltjahr etc gemacht^^ coole sache =)

würde die gleiche prozedur übrigens auch andersrum funktionieren? als +1 tag ohne das makro groß umzuschreiben ?

Hallo.

Hallo danke an euch beide Sebastian dein funtioniert irgendwie
nicht richtig er setz den tag nicht zurück wenn ich es so in
eine txt kopiere und benutze.

an sich so wie das makro aussieht hast ja sogar mit schaltjahr
etc gemacht^^ coole sache =)

Und wenn ich mich nicht vertippt hätte, ginge es auch:

set monat=%date:~-7:2%

ist falsch, dass muss richtig sein so:

set monat=%date:~-7,2%

Und das hier ist ein :done, dass stellt der Parser leider falsch dar:

done

würde die gleiche prozedur übrigens auch andersrum
funktionieren? als +1 tag ohne das makro groß umzuschreiben ?

Ja, mit ein bisschen Umgestelle geht das:

@echo off
setlocal
rem Datum auslesen
set tag=%date:~-10,2%
set monat=%date:~-7,2%
set jahr=%date:~-4%

if %monat% EQU 1 set maxtag=31
if %monat% EQU 3 set maxtag=31
if %monat% EQU 4 set maxtag=30
if %monat% EQU 5 set maxtag=31
if %monat% EQU 6 set maxtag=30
if %monat% EQU 7 set maxtag=31
if %monat% EQU 8 set maxtag=31
if %monat% EQU 9 set maxtag=30
if %monat% EQU 10 set maxtag=31
if %monat% EQU 11 set maxtag=30
if %monat% EQU 12 set maxtag=31

if %monat% NEQ 2 goto :donemax
set /a mod4=jahr % 4
set /a mod100=jahr % 100
set /a mod400=jahr % 400
set maxtag=28
if %mod4% NEQ 0 goto :donemax
set maxtag=29
if %mod100% NEQ 0 goto :donemax
set maxtag=28
if %mod400% NEQ 0 goto :donemax
set maxtag=29



> donemax (das soll :donemax heißen)


set /a tag+=1
if %tag% LEQ %maxtag% goto :done
set tag=1
set /a monat+=1
if %monat% LEQ 12 goto :done
set monat=1
set /a jahr+=1



> done (das soll wieder :done heißen)


date %tag%.%monat%.%jahr%

Sebastian.

Danke jetzt funktionieren beide!

-1 Tag geht und +1 Tag geht über den Monat auch.

Aber du hattest beim Schaltjahr im Februar Probiert (weil es so aussah als ob du es eingebaut hattest bei -1Tag ) das mit dem einen Tag mehr im Schaltjahr. Ich hatte es im Februar 2008 getestet aber er springt beim 1 März zurück auf den 28. Februar und lässt den 29. aus und bei +1 Tag war Schaltjahr glaub nicht drin.

Hallo.

Eigentlich sollte es bei beiden drin sein, aber da war mal wieder ein Fehler von mir drin. Kommt davon, wenn man es nicht richtig ausprobiert. Ersetze in diesen Zeilen das % durch %%, dann geht es:

set /a mod4=jahr % 4
set /a mod100=jahr % 100
set /a mod400=jahr % 400

Das mit dem einzelnen % geht nur auf der Kommandozeile, aber nicht in Batchdateien, da muss man das aus irgendeinem Grund doppeln.

Sebastian.

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

1 Like

Gut jetzt hats Funktioniert bei beiden!

Ich danke dir.

mfg Philipp