pblacky
Goto Top

Tag zu aktueller Zeit addieren - führende Null fehlt

Hallo Ihr Lieben,
Ich habe ein kleines Problem und braucht einen Tipp.

Mochte zum aktuellen Tag einen Tag dazugeben und diesen Wert in eine Variable schreiben.
Dazu habe ich folgenden Code erstellt:
for /f "tokens=1-6 delims=:.," %%a in ("%date%") do @set Tag=%%a.%%b  
for /f "tokens=1-6 delims=:.," %%a in ("%date%") do @set Monat=%%b  
set /a "Tag1=%date:~,2%+1"  
set Morgen=%Tag1%.%Monat%

Grundsätzlich funktioniert mein Batch, aber die führende Null wird beim Adieren aus dem Datum entfernt.
Natürlich weiß ich, wie ich da eine Null reinkriege, aber ich weiß leider nicht wie ich das nur dann mache, wenn der Tag unter 10 ist.

Hat jemand einen Tipp ?

Content-Key: 2659761978

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

Printed on: May 9, 2024 at 17:05 o'clock

Member: rubberman
Solution rubberman May 01, 2022 at 19:21:35 (UTC)
Goto Top
Grundsätzlich funktioniert mein Batch
Nicht mal ansatzweise. Zahlen mit führenden Nullen werden als oktale Zahlen interpretiert (08 und 09 sind ungültig). Und dann denke mal über Monatsende (incl. Schaltjahrregeln) und Jahresende nach.
@echo off &setlocal
for /f "tokens=1-3 delims=." %%i in ("%date%") do call :DaysAdd %%k %%j %%i 1 y m d  
echo %d%.%m%.%y%
pause
exit /b

:DaysAdd ByVal_YearIn ByVal_MonthIn ByVal_DayIn ByVal_DeltaIn ByRef_YearOut ByRef_MonthOut ByRef_DayOut
setlocal EnableExtensions
set /a "Year=%~1,Month=100%~2%%100,Day=100%~3%%100"  
set /a "a=(14-Month)/12,b=Year+4800-a,c=(153*(Month+12*a-3)+2)/5+Day+b*365+b/4-b/100+b/400-1+%~4,d=(4*c+3)/146097,e=-d*146097/4+c,f=(4*e+3)/1461,g=(-1461*f)/4+e,h=(5*g+2)/153"  
set /a "y=d*100+f-4800+h/10,m=(-h/10)*12+h+3,d=((153*h+2)/-5)+g+1"  
set /a "Month=10%m%,Day=10%d%"  
endlocal&set "%~5=%y%"&set "%~6=%Month:~-2%"&set "%~7=%Day:~-2%"&goto:eof  

In Sprachen wie PowerShell braucht man sich nicht so zu verbiegen.
(Get-Date).AddDays(1).ToString("dd.MM.yyyy")  

Steffen
Member: Mr.Mumble
Mr.Mumble May 02, 2022 at 11:10:03 (UTC)
Goto Top
Das wollte ich auch gerade sagen, in PowerShell ist's viel einfacher....danke rubberman.
Member: pblacky
pblacky May 02, 2022 at 11:42:31 (UTC)
Goto Top
WOW!!!!!
Hatte nicht gedacht, dass es so komplex ist, das in Batch umzusetzen, bin deshalb noch mehr überwältigt von der Lösung.
Vielen Dank Steffen!

Das mit der Powershell wurde mir hier schon ein paar Mal nahegelegt, leider hab ich bis jetzt immer noch nicht die Einstiegshürde geschafft. Grund dafür ist, dass ich bis jetzt immer an der komplexen Security beim Aktivieren gescheitert bin ;-(
Bin leider totaler NEWBIE was die PS betrifft.
Member: Mr.Mumble
Mr.Mumble May 02, 2022 at 11:52:13 (UTC)
Goto Top
Wenn du mit "Security" die "execution policy" meinst...

do you want to know more?
Member: rubberman
rubberman May 02, 2022 updated at 13:11:19 (UTC)
Goto Top
Hatte nicht gedacht, dass es so komplex ist
Oh doch. Batch kennt keinen DateTime Typ (und keine Fließkommazahlen und keine Arrays und keine Strukturen und keine ...).

bin deshalb noch mehr überwältigt von der Lösung.
Danke face-smile Aber das basiert natürlich auf uralten Algorithmen, die ich nicht neu erfunden, sondern nur angepasst habe.
Prinzip: Gregorianischer Kalender -> Julianisches Datum -> Tage addieren/subtrahieren -> Gregorianischer Kalender
https://de.wikipedia.org/wiki/Umrechnung_zwischen_julianischem_Datum_und ...

Das mit der Powershell wurde mir hier schon ein paar Mal nahegelegt
Zu Recht.
Nicht wirklich empfehlenswert, aber immerhin möglich, wäre die Berechnung von PowerShell ausführen zu lassen und das Ergebnis in einer Batch FOR /F Schleife einzufangen.
for /f %%i in (
  'powershell.exe -nop -ep Bypass -c "(Get-Date).AddDays(1).ToString('dd.MM.yyyy')"'  
) do echo %%i

Uuuuund um auch die ursprüngliche Frage noch zu beantworten, wie man ein- und zweistellige Zahlen immer zweistellig bekommt, hier mal ein paar Möglichkeiten. Have fun!
@echo off &setlocal
:: hier ändern und mit ein- und zweistelligen natürlichen Zahlen testen:
set /a "_n0=9"  

:: Variante 1:
:: wenn <10, dann 0 voranstellen, sonst nicht
if %_n0% lss 10 (set "_n1=0%_n0%") else set "_n1=%_n0%"  

:: Variante 2:
:: immer 0 voranstellen, dann die letzten beiden Ziffern verwenden
set "_n2=0%_n0%"  
set "_n2=%_n2:~-2%"  

:: Variante 3:
:: immer 10 voranstellen (ergibt einen integralen Wert, darum ist SET /A möglich), dann die letzten beiden Ziffern verwenden
set /a "_n3=10%_n0%"  
set "_n3=%_n3:~-2%"  

:: Variante 4:
:: Zehnerstelle (per Division) und Einerstelle (per Modulo) berechnen, dann verketten
set /a "tens=_n0/10,ones=_n0%%10"  
set "_n4=%tens%%ones%"  

:: alle _n... Variablen mit ihrem Wert ausgeben:
set _n

pause

Steffen
Member: pblacky
pblacky May 02, 2022 at 13:21:27 (UTC)
Goto Top
DU erweiterst gerade meinen Horizont, was logisches Denken betrifft face-wink
Speziell auf Variante 2 hätt ich auch selbst kommen können!

Nun bin ich natürlich mit weit über 50J kein "junger Hüpfer" mehr, deshalb bin ich auch immer wieder etwas widerstpenstig, wenn es darum geht etwas so gravierend Neues wie Powershell zu lernen.
Habe nie gelernd "objektorientiert" zu denken, daher fürchte ich dass mir die PS zu komplex ist, da noch voll einzusteigen!

Aber vielleicht fang ich ja an damit die Powershell berechnen zu lassen und das dann in der Batch einzufangen, das ist schon mal eine brauchbare "Einstiegsdroge" face-wink

Danke jedenfalls für die unermüdlcihe Hilfe, die ich hier von euch bekomme!!!!
Mitglied: 148523
148523 May 03, 2022 at 08:34:34 (UTC)
Goto Top