ahoefer21
Goto Top

Datum vom Vortag in Datei schreiben

Weis irgend jemand, wie man mit einem Batch-file das das Datum vom gestrigen Tag bekommt??

Content-Key: 26145

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

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

Member: maneich
maneich Feb 16, 2006 at 18:15:26 (UTC)
Goto Top
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

:: -----------------------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
Member: Biber
Biber Apr 14, 2006 at 17:08:13 (UTC)
Goto Top
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
Yesterday >file.xyz würde dann das gestrige Datum in eine Datei file.xyz schreiben.

Gruß Biber
Member: maneich
maneich Apr 14, 2006 at 18:27:39 (UTC)
Goto Top
Hallo,

@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
in %out% steht dann das gestrige Datum zur Weiterverarbeitung.

MfG maneich
Member: Biber
Biber Apr 14, 2006 at 18:55:23 (UTC)
Goto Top
@maneich
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
Nun steht es in %yesterdate%

Amüsierten Gruß
Biber
Member: thats
thats Feb 08, 2007 at 06:28:05 (UTC)
Goto Top
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.

if not %tag%==01 set /a tag=%tag%-1 & goto:end
Member: Biber
Biber Feb 08, 2007 at 06:55:59 (UTC)
Goto Top
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:
...
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
Member: thats
thats Feb 08, 2007 at 08:09:24 (UTC)
Goto Top
okay danke, biber.

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
Member: maneich
maneich Feb 08, 2007 at 10:59:31 (UTC)
Goto Top
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
Member: thats
thats Feb 08, 2007 at 11:32:05 (UTC)
Goto Top
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.

@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
Member: Biber
Biber Feb 08, 2007 at 13:33:53 (UTC)
Goto Top
Moin thats,

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
Member: thats
thats Feb 08, 2007 at 14:10:18 (UTC)
Goto Top
ha super perfekt! also werd mich dann mal mit dem script ein paar hundert jahre verewigen. mal schaun obs solange hält +smile+

grüße thats