pbelcl
Goto Top

Datumsmanipulation mit Variablen in batch

Hallo ihr Lieben,

Ich habe ein batch der mir vom aktuellen Datum ein Monat zurückrechnet.

for /F "delims=. tokens=2" %%B in ("%date%") do set "MON=%%B"  
set "MON=02"  
SET /A VMZ=%MON%-1
if %VMZ%==0 set "VMN=12"  
if not %VMZ%==0 set "VMN=%VMZ%"  

Das funktioniert schon ganz brauchbar, nur dass ich ein Problem und eine Herausforderung habe.

Problem:
Im Zuge der Verarbeitung steht in der Variable "VMZ" eine Zahl als z.B. "2".
Ich brauche dort aber "02" drinnen, weil es für die weitere Verarbeitung als Verzeichnisnamen nötig ist!
Habt ihr einen Tipp, wie ich die Verarbeitung ändern muss?

Herausforderung:
Ich brauch diese Routine auch für einen Job der Dateien kopiert die älter sind als 3 Monate.
Auch dirt brauche ich die Prüfung für den Jahreswechsel.
Mit %MON-1% komme ich da aber nicht weiter, denn wenn ich von "01" 3 abziehe dann kommt leider auch nur "1" heraus

Habt ihr hier einen Tipp (oder zwei) für mich?

Content-ID: 301286

Url: https://administrator.de/forum/datumsmanipulation-mit-variablen-in-batch-301286.html

Ausgedruckt am: 23.12.2024 um 07:12 Uhr

Biber
Lösung Biber 08.04.2016 aktualisiert um 17:10:05 Uhr
Goto Top
Moin pbelcl,

@2stellige Mionate ggf mit führender 0: füge einfach noch eine neue Zeile an.
Set vmz=0%vmz:~-2,2%

Damit wird aus Monat 1...9 ein 01...09 und monate 10-12 bleiben zweistellig.

@jahreswechsel berücksichtigen: greif das Jahr mit ab.
Dazu Zeile 02 erweitern:
for /f "delims=. tokens=1-3" %%A in ("%date%") do (SET mon=%%B & SET jahr=%%C
In Folge Zeile 04 (Prüfung auf VMZ==0 erweitern um (dekrementiere JAHR)

Im ganzen Satz:
@echo off &setlocal
for /F "delims=. tokens=1-3" %%A in ("%date%") do ( set "MON=%%B" & SET JAHR=%%C)  
REM ??? set "MON=02"  
SET /A VMZ=%MON%-1
if %VMZ%==0 (set /a VMZ=12, JAHR+=-1)
Set vmz=0%vmz:~-2,2%
....
REM (hier: eigentliche Verarbeitung, to be done)
...

Ungetestet, aber relativ überzeugt davon.

Grüße
Biber
P.S. @Set /a jahr+=-1
ja, der CMD-Interpreter kann nur ein SET /a +=.., also ein Increment.
Wollte ich eigentlich nie erwähnen, weil es undokumentiert ist, aber...
pbelcl
pbelcl 08.04.2016 aktualisiert um 18:59:09 Uhr
Goto Top
Hallo Biber,
Danke für deine rasche Hilfe!
Präzise wie immer face-wink

hab das jetzt mal alles zusammengebaut und folgendes kam raus:
for /F "delims=. tokens=1-3" %%A in ("%date%") do ( set "MON=%%B" & SET JAHR=%%C)   
SET /A VMN=%MON%-3
if %VMN%==0 (set /a VMN=12, JAHR+=-1)
Set VMN=0%VMN:~-2,2%

SET AJR=%DATE:~-4%
SET /A VJR=%AJR%-1
if %MON% gtr %VMN% set "Z_V2=%AJR%-%VMN%"   
if not %MON% gtr %VMN% set "Z_V2=%VJR%-%VMN%"  

Solange die Minuszahl von %MON% nicht mehr wir 3 ist klappt das schon perfekt!

Sobald ich mehr abziehe als Monate da sind kommt nicht "1" raus sondern eine MINUS Zahl.
Beispiel:
SET /A VMN=%MON%-5
Der oben genannte Code zieht 5 Monate statt 3 Monate ab
und dann steht in %VMN% "0-1". ;-(
rubberman
Lösung rubberman 08.04.2016 um 21:26:21 Uhr
Goto Top
Hallo pbelcl,

wenn dein Delta unterschiedlichste Werte annehmen kann, nutze besser einen mathematischen Algorithmus. Beispiel:
@echo off &setlocal
set "delta=-1"  

for /F "delims=. tokens=1-3" %%A in ("%date%") do call :MonthsAdd %%C %%B %%A %delta% newY newM newD  

echo %newD% %newM% %newY%
pause

exit /b


:MonthsAdd ByVal_YearIn ByVal_MonthIn ByVal_DayIn ByVal_DeltaIn ByRef_YearOut ByRef_MonthOut ByRef_DayOut
setlocal DisableDelayedExpansion
set /a "Year = %~1, Month = 100%~2 %% 100, Day = 100%~3 %% 100"  
set /a "Year = (Year * 12 + Month + %~4 - 1) / 12, Month = (((Month + %~4) %% 12) + 11) %% 12 + 1"  
set /a "MaxDIM = 30 + !(((Month & 9) + 6) %% 7) + !(Month ^ 2) * (!(Year %% 4) - !(Year %% 100) + !(Year %% 400) - 2)"  
if %Day% gtr %MaxDIM% set /a "Day = MaxDIM"  
set /a "Month = 10%Month%, Day = 10%Day%"  
endlocal &set "%~5=%Year%" &set "%~6=%Month:~-2%" &set "%~7=%Day:~-2%" &exit /b  
Versuche es mit anderen Werten für delta ...

Grüße
rubberman

PS:
@Biber
Wollte ich eigentlich nie erwähnen, weil es undokumentiert ist, aber...
Ich denke, das ist nicht nur undokumentiert.
@echo off &setlocal
set "x=4712"  
set /a "x-=1"  
echo %x%
Ausgabe:
4711
Ich hatte bislang keine Probleme mit Dekrementierungen.
Biber
Biber 08.04.2016 aktualisiert um 22:20:02 Uhr
Goto Top
Moin pbelcl,

sorry, deine Anforderung mit "minus x Monate" statt minus 1 Monat hatte ich überlesen.

Nimm es nicht persönlich, aber in deinem Schnipsel bearbeite ich jezz' nix,
Es ist Freitag, Ferierabend und bei einem Sack voll Variablen namens %VMN%, %Z_V2%, %AJR% und %VJR% kann ich nicht so richtig chillen.

Aber eine Strategie hätte ich, etwas ungenauer als rubbermännles Variante, aber hey! ->sie tut.

Setze einfach die Variable für "Monat" auf ein Vielfaches von 12 plus die Monatszahl,.
Beispiel: Nimm als "Rechenvariable" %MON% einfach in der FOR-Anweisung
...Set /a MON=1200%%B ....

Dann wird
- bei dem Monats-String "01" im Datum "01.01.2016" ein Wert =120001 daraus
- bei dem Monats-String "04" im Datum "08.04.2016" ein Wert =120004 daraus
- bei dem Monats-String "12" im Datum "31.12.2016" ein Wert =120012 daraus

Von diesem Wert kannst du 1 oder -5 oder 38 abziehen.

Wenn du danach den Modulo-Operator anwendest
Set /a MON=MON %% 12
dann hast du den richtigen Monat.
[Edit] Musst allerdings, wenn 0 herauskommt, auf 12 setzen wie oben auch, [/Edit]

Kein Hexenwerk.

@rubberman

Hmm, dann muss ich meine Erinnerung aus der falschen Schublade gezogen haben.
Hast wohl recht.... kann eigentlich auch nich' sein, dass bei M$ irgendwatt undokumentiert oder hingeschlampert ist.

Grüße
Biber
rubberman
rubberman 09.04.2016 aktualisiert um 00:55:12 Uhr
Goto Top
kann eigentlich auch nich' sein, dass bei M$ irgendwatt undokumentiert oder hingeschlampert ist
Da gebe ich dir vollkommen Recht. Nicht nur irgendwas ist undokumentiert, verbugt und verhält sich undefiniert, sondern das meiste face-big-smile

Schönes WE
rubberman
pbelcl
pbelcl 10.04.2016 um 15:11:48 Uhr
Goto Top
@rubberman
Habe zwar nur zu 60% verstanden wir das funktioniert, tatsache ist es klappt!!
Ich denke ich werde das aus Basisbatch für alle CopyJobs hernehmen, die irgendwas archivieren müssen face-wink
Danke rubberman!

@Biber
Danke auch dir für deine Hilfe!
Ich weiß meine Variablen könnten sprechender sein, habe sie beim rumprobieren immer wieder verändern müssen, daher die "Baustelle".
Danke dass du es dir trotzdem angesehen hast face-wink
rubberman
Lösung rubberman 10.04.2016 um 18:02:03 Uhr
Goto Top
Habe zwar nur zu 60% verstanden
Zeile 15 ist der Schlüssel. Die solltest du dir noch mal genauer ansehen.

Basisbatch
Hehe, ja genau aus meinem Fundus zu solchen Themen, stammt die Subroutine, die ich gepostet habe.
Wenn ich es hätte neu schreiben müssen, sähe das etwa so aus:
@echo off &setlocal
set "delta=-12"  

for /f %%i in ('wmic path Win32_LocalTime get Year^,Month /value') do for /f %%j in ("%%i") do set /a %%j  
set /a "Year = (Year * 12 + Month + delta - 1) / 12, Month = (((Month + delta) %% 12) + 11) %% 12 + 101"  
set "Month=%Month:~-2%"  

echo %Month% %Year%
pause
Seit Erfindung von WMIC ist es auch mit den Windows-Kommandozeilentools möglich, Datum und Zeit formatunabhängig zu bekommen.

Grüße
rubberman