Datum vom Vortag in Datei schreiben
Weis irgend jemand, wie man mit einem Batch-file das das Datum vom gestrigen Tag bekommt??
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 26145
Url: https://administrator.de/contentid/26145
Ausgedruckt am: 22.11.2024 um 09:11 Uhr
11 Kommentare
Neuester Kommentar
Hallo,
die Sache ist eigentlich sehr einfach, wird aber etwas komplizierter, wenn damit in den vorherigen Monat gewechselt werden muß, da hier ja bekanntlich der letzte Tag unterschiedlich ist.
Also zunächst mußt Du das Datum trennen z.B. mit
set jahr=%date:~-4%
set monat=%date:~-7,2%
set tag=%date:~-10,2%
dann Abfrage, ob Datum 1 bzw. 01, wenn nein, kannst Du gleich 1 subtrahieren mit
if not %tag%==01 set /a tag=%tag%-1 & goto:end
Wenn %tag% 1 ist muß der letzte Tag des vorherigen Monats genommen werden. Der Januar wird einfach auf 13 gesetzt.
if not %monat%==1 goto ts1
set monat=13
set /a jahr=%jahr%-1
for %%e in (2 3 4 5 6 7 8 9 10 11 12 13) do if %monat%==%%e set /a monat=%monat%-1
Für die entsprechenden Tage, wird die Batch nochmals aufgerufen mit
set /a x=%monat%+2
set i = 3
%0 : loop,31,28,31,30,31,30,31,31,30,31,30,31,?
und bei :loop fertiggestellt
:loop
if %i%==%x% for %%e in (set goto:ts2) do %%e tag=%3
eingabe i=add %i%, 1
for %%e in (shift goto:loop) do %%e
:ts2
echo Tag: %tag%
pause
Zum Schluß wird das alles wieder zusammen gesetzt mit
:end
set datum=0%tag:~-2%.0%monat:~-2%.%jahr%
Die Batch als Ganzes:
Name = vortag.bat
Aufruf = vortag datum
Was hier noch nicht berücksichtigt ist, ist das Schaltjahr.
MfG maneich
die Sache ist eigentlich sehr einfach, wird aber etwas komplizierter, wenn damit in den vorherigen Monat gewechselt werden muß, da hier ja bekanntlich der letzte Tag unterschiedlich ist.
Also zunächst mußt Du das Datum trennen z.B. mit
set jahr=%date:~-4%
set monat=%date:~-7,2%
set tag=%date:~-10,2%
dann Abfrage, ob Datum 1 bzw. 01, wenn nein, kannst Du gleich 1 subtrahieren mit
if not %tag%==01 set /a tag=%tag%-1 & goto:end
Wenn %tag% 1 ist muß der letzte Tag des vorherigen Monats genommen werden. Der Januar wird einfach auf 13 gesetzt.
if not %monat%==1 goto ts1
set monat=13
set /a jahr=%jahr%-1
for %%e in (2 3 4 5 6 7 8 9 10 11 12 13) do if %monat%==%%e set /a monat=%monat%-1
Für die entsprechenden Tage, wird die Batch nochmals aufgerufen mit
set /a x=%monat%+2
set i = 3
%0 : loop,31,28,31,30,31,30,31,31,30,31,30,31,?
und bei :loop fertiggestellt
:loop
if %i%==%x% for %%e in (set goto:ts2) do %%e tag=%3
eingabe i=add %i%, 1
for %%e in (shift goto:loop) do %%e
:ts2
echo Tag: %tag%
pause
Zum Schluß wird das alles wieder zusammen gesetzt mit
:end
set datum=0%tag:~-2%.0%monat:~-2%.%jahr%
Die Batch als Ganzes:
Name = vortag.bat
Aufruf = vortag datum
:: -----------------------zip
@echo off
cls
if %2'==loop' goto %2
set z=%1
set jahr=%date:~-4%
set monat=%date:~-7,2%
set tag=%date:~-10,2%
if not %tag%==01 set /a tag=%tag%-1 & goto:end
if not %monat%==1 goto ts1
set monat=13
set /a jahr=%jahr%-1
:ts1
for %%e in (2 3 4 5 6 7 8 9 10 11 12 13) do if %monat%==%%e set /a monat=%monat%-1
set /a x=%monat%+2
set i = 3
%0 : loop,31,28,31,30,31,30,31,31,30,31,30,31,?
:loop
if %i%==%x% for %%e in (set goto:end) do %%e tag=%3
eingabe i=add %i%, 1
for %%e in (shift goto:loop) do %%e
:end
set %z%=0%tag:~-2%.0%monat:~-2%.%jahr%
cls
:: ---------------------------snip
Was hier noch nicht berücksichtigt ist, ist das Schaltjahr.
MfG maneich
Was hier noch nicht berücksichtigt ist, ist das Schaltjahr.
Na gut, dann berücksichtigen wir das Schaltjahr auch noch:
:: ----snipp yesterday.bat ---Gibt Datum vom Vortag aus...
@echo wscript.echo dateAdd("d",-1, date())>%temp%\gestern.vbs
@cscript //nologo %temp%\gestern.vbs
@del %temp%\gestern.vbs
:: ---snapp
Gruß Biber
Hallo,
@Biber
so kann man es natürlich auch einfacher machen; aber dies kann man noch verbessern:
in %out% steht dann das gestrige Datum zur Weiterverarbeitung.
MfG maneich
@Biber
so kann man es natürlich auch einfacher machen; aber dies kann man noch verbessern:
:: ----snipp yesterday.bat ---Gibt Datum vom Vortag aus...
@echo wscript.echo "set out=" & dateAdd("d",-1, date())>%temp%\gestern.vbs
@cscript //nologo %temp%\gestern.vbs>%temp%\gestern.bat
for %%e in (%temp%\gestern.bat del) do call %%e %temp%\gestern.???
echo %out%
:: ---snapp
MfG maneich
@maneich
Mal sehen, wer von uns beiden es zuerst auf einen Oneliner zusammengedampft hat *gg
Nun steht es in %yesterdate%
Amüsierten Gruß
Biber
Mal sehen, wer von uns beiden es zuerst auf einen Oneliner zusammengedampft hat *gg
::------snipp
@echo wscript.echo dateAdd("d",-1, date())>%temp%\gestern.vbs
@For /f %%i in ('cscript //nologo %temp%\gestern.vbs') do @set "yesterdate=%%i"
@del %temp%\gestern.vbs
::---snapp
Amüsierten Gruß
Biber
hallo an alle,
hab mir das script mal angesehen und wollts mal testen. nur leider hab ich das problem, dass ich in der zeile (s.u.) folgende fehlermeldung bekomme:
Ungültige Zahl. Nummerische Konstanten sind entweder dezimale (17), hexadezimale(0x11) oder oktale (021) Zahlen.
hab mir das script mal angesehen und wollts mal testen. nur leider hab ich das problem, dass ich in der zeile (s.u.) folgende fehlermeldung bekomme:
Ungültige Zahl. Nummerische Konstanten sind entweder dezimale (17), hexadezimale(0x11) oder oktale (021) Zahlen.
if not %tag%==01 set /a tag=%tag%-1 & goto:end
Moin thats,
das passiert, wenn in der Variablen %tag% eine 08 bzw. 09 steht.
Zahlen mit einer führeneden Ziffer Null werden ja, wie der sympathische Weltmarktführer dokumentiert hat, als Oktal-Werte interpretiert.
Und da sind natürlich 08 und 09 ungültig.
Workaround:
...oder, auf deutsch:
- mache aus 01,...07...22...30 eine 100001, ....100007....100022, ...100030
- subtrahiere 1
- nimm vom Ergebnis nur die letzten beiden Stellen
Gruss
Biber
das passiert, wenn in der Variablen %tag% eine 08 bzw. 09 steht.
Zahlen mit einer führeneden Ziffer Null werden ja, wie der sympathische Weltmarktführer dokumentiert hat, als Oktal-Werte interpretiert.
Und da sind natürlich 08 und 09 ungültig.
Workaround:
...
REM Sonderbehandlung Tag ist 01....
if %tag%==01 goto Sonderfall
REM alle anderen Fälle...
Set /a %tag%=1000%tag%
Set /a %tag%-=1
Set tag=%tag:~-2,2%
...oder, auf deutsch:
- mache aus 01,...07...22...30 eine 100001, ....100007....100022, ...100030
- subtrahiere 1
- nimm vom Ergebnis nur die letzten beiden Stellen
Gruss
Biber
okay danke, biber.
klappt soweit, nur wenn ich das datum auf éinen monats-1. stelle, mag er mich nicht mehr.
mein code einstweilen:
klappt soweit, nur wenn ich das datum auf éinen monats-1. stelle, mag er mich nicht mehr.
mein code einstweilen:
if %2'==loop' goto %2
set z=%1
set jahr=%date:~-4%
set monat=%date:~-7,2%
set tag=1000%date:~-10,2%
if not %tag%==100001 set /a tag=%tag%-1 & goto:end
if not %monat%==1 goto ts1
set monat=13
set /a jahr=%jahr%-1
:ts1
for %%e in (2 3 4 5 6 7 8 9 10 11 12 13) do if %monat%==%%e set /a monat=%monat%-1
set /a x=%monat%+2
set i = 3
%0 : loop,31,28,31,30,31,30,31,31,30,31,30,31,?
:loop
if %i%==%x% for %%e in (set goto:end) do %%e tag=%3
eingabe i=add %i%, 1
for %%e in (shift goto:loop) do %%e
:end
set z=%tag:~-2,2%.%monat:~-2,2%.%jahr%
pause
Hallo,
was für die Berechnungen bei führender Null für den Tag gilt, sollte dann ja auch für den Monat gelten.
Wenn Du bei der Ermittlung rein auf Batchbasis bleiben willst, ist es sicher besser, die führenden Nullen zunächst zu entfernen, und am Ende wieder hinzu zu fügen.
Also:
set jahr=%date:~-4%
set monat=%date:~-7,2%
set tag=%date:~-10,2%
if %tag%<10 set tag=%tag:~-1%
if %monat%<10 set monat=%monat:~-1%
damit sind keine führenden Nullen mehr vorhanden.
Nach den Berechnungen dann die Umkehr:
if %tag%<10 set tag=0%tag%
if %monat%<10 set monat=0%monat%
Berechnungen für ein Datum sind auf reiner Batchbasis etwas umständlich. Einfacher geht es mit VBS (siehe Beispiele weiter oben), da hier bereits alle Möglichkeiten fest integriert sind und der Ablauf dürfte sicher genau so schnell sein.
MfG maneich
was für die Berechnungen bei führender Null für den Tag gilt, sollte dann ja auch für den Monat gelten.
Wenn Du bei der Ermittlung rein auf Batchbasis bleiben willst, ist es sicher besser, die führenden Nullen zunächst zu entfernen, und am Ende wieder hinzu zu fügen.
Also:
set jahr=%date:~-4%
set monat=%date:~-7,2%
set tag=%date:~-10,2%
if %tag%<10 set tag=%tag:~-1%
if %monat%<10 set monat=%monat:~-1%
damit sind keine führenden Nullen mehr vorhanden.
Nach den Berechnungen dann die Umkehr:
if %tag%<10 set tag=0%tag%
if %monat%<10 set monat=0%monat%
Berechnungen für ein Datum sind auf reiner Batchbasis etwas umständlich. Einfacher geht es mit VBS (siehe Beispiele weiter oben), da hier bereits alle Möglichkeiten fest integriert sind und der Ablauf dürfte sicher genau so schnell sein.
MfG maneich
also nachdem bei mir NUR der tag wichtig war und nicht das monat bzw jahr hab ichs mal so gelöst - mit meinen minderwertigen dos-kenntnissen. aber es funktioniert.
was mich etwas stört, dass ich für die schaltjahre leider kein vielfaches eingeben konnte, sodass er mir das immer auf die nächste 4 jahre von zb 2008 weg berechnet.
was mich etwas stört, dass ich für die schaltjahre leider kein vielfaches eingeben konnte, sodass er mir das immer auf die nächste 4 jahre von zb 2008 weg berechnet.
@echo off
set jahr=%date:~-4%
set monat=%date:~-7,2%
set tag=1000%date:~-10,2%
set /a vormonat=%monat%-1
if not %tag%==100001 set /a tag=%tag%-1 & goto end
for %%j in (0 1 3 5 7 8 10) do if %vormonat%==%%j set /a tag=100031 & goto end
for %%k in (4 6 9 11) do if %vormonat%==%%k set /a tag=100030 & goto end
set /a tag=100028
for %%l in (2004 2008 2012 2016 2020 2024 2028 2032 2036 2040 2044 2048 2052) do IF %jahr%==%%l set /a tag=100029
:end
set tag=%tag:~-2,2%
echo %tag%
pause
Moin thats,
HTH Biber
was mich etwas stört, dass ich für die schaltjahre leider kein vielfaches eingeben konnte,
eine Alternative zur For ...(2004.......2052) -Anweisung ist die FOR /L-Anweisung:>(=14:31:03 D:\temp=)
>for %l in (2004 2008 2012 2016 2020 2024 2028 2032 2036 2040 2044 2048 2052) do @echo %l
2004
2008
2012
2016
2020
2024
2028
2032
2036
2040
2044
2048
2052
(=14:31:09 D:\temp=)
>for /l %l in (2004,4, 2052) do @echo %l
2004
2008
2012
2016
2020
2024
2028
2032
2036
2040
2044
2048
2052
HTH Biber