Datumsmanipulation mit Variablen in batch
Hallo ihr Lieben,
Ich habe ein batch der mir vom aktuellen Datum ein Monat zurückrechnet.
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?
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?
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 301286
Url: https://administrator.de/contentid/301286
Ausgedruckt am: 22.11.2024 um 18:11 Uhr
7 Kommentare
Neuester Kommentar
Moin pbelcl,
@2stellige Mionate ggf mit führender 0: füge einfach noch eine neue Zeile an.
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:
In Folge Zeile 04 (Prüfung auf VMZ==0 erweitern um (dekrementiere JAHR)
Im ganzen Satz:
Ungetestet, aber relativ überzeugt davon.
Grüße
Biber
P.S. @
ja, der CMD-Interpreter kann nur ein
Wollte ich eigentlich nie erwähnen, weil es undokumentiert ist, aber...
@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...
Hallo pbelcl,
wenn dein Delta unterschiedlichste Werte annehmen kann, nutze besser einen mathematischen Algorithmus. Beispiel:
Versuche es mit anderen Werten für delta ...
Grüße
rubberman
PS:
@Biber
Ausgabe:
Ich hatte bislang keine Probleme mit Dekrementierungen.
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
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%
4711
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
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
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
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
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
Grüße
rubberman