madmad
Goto Top

Batch Variable mit Kalenderwoche oder ähnliches

Im Rahmen eines Backupscripts brauch ich eine Variable, die eine Woche lang den gleichen Wert hat und danach um eins höher ist also z.B.:

05.01.09 - 11.01.09 -> %woche% = 1
12.01.09 - 18.01.09 -> %woche% = 2
19.01.09 - 25.01.09 -> %woche% = 3
...

Spontan habe ich überlegt die Kalenderwoche zu nehmen (da die Tatsache dass sie nach ein Jahr von vorne losgehen irelevant ist), allerdings habe ich keine Möglichkeit gefunden die Kalenderwoche auszugeben.

Also habe ich überlegt ob es eine Variable wie "tage/stunden/secunden seid der Unixzeit", gibt dabei ist mir aufgefallen das es im Batch eigentlich nur %time% und %date% gibt.

Da ich die Ausgabe von %date% leider nicht direkt verwenden kann müsste ich sie also irgend wie so umwandeln das sie mir die Anzahl der Montage bzw. Sonntage seit Datum xy ausgibt. Dies übersteigt allerdings meine Fähigkeiten ...

Kann mir also jemand von euch zeigen wie ich sowas realisieren kann, oder kennt jemand von euch einen einfacherren Lösungweg als meine Idee?

Vielen Dank schon mal

Content-ID: 105150

Url: https://administrator.de/forum/batch-variable-mit-kalenderwoche-oder-aehnliches-105150.html

Ausgedruckt am: 23.12.2024 um 14:12 Uhr

bastla
bastla 04.01.2009, aktualisiert am 18.10.2012 um 18:37:35 Uhr
Goto Top
Hallo madmad und willkommen im Forum!

Darf ich Dich zum Thema "Kalenderwoche" gleich zum diesbezüglichen Standardwerk (mindestens face-wink für den deutschsprachigen Raum ) von Workshop Batch for Runaways Part III Datums- und Zeitvariablen im Batch ...

Solltest Du es sehr eilig haben:
@echo off & setlocal
set G=%temp%\GetWeek.vbs
>%G% echo WScript.Echo Datepart("ww",WScript.Arguments(0),2)  
for /f %%i in ('cscript //nologo %G% %date%') do set KalWo=%%i  
echo %KalWo%
Zum Testen kannst Du %date% in der Zeile 4 auch durch eine Datumsangabe im Format "TT.MM.JJJJ" ersetzen.

Grüße
bastla
madmad
madmad 04.01.2009 um 19:44:39 Uhr
Goto Top
Ok danke, dass ist genau das was ich gesucht habe.
Den workshop werde ich mir mal anschauen wenn ich viel zeit hab.
Habe den gerade mal überflogen und ich muss schon sagen, großes Lob an Biber...

Vielen Danck
RoadRacer82
RoadRacer82 23.10.2016 um 14:27:39 Uhr
Goto Top
KalenderWoche (Mo-So) per Batch

@ECHO OFF
setlocal
chcp 1252>nul

REM KalenderWoche (Mo-SO)
REM Datum
set /A d=%date:~0,2%
set /A m=%date:~3,2%
set /A y=%date:~6,4%

REM Tag des Jahres
if %m% == 1 set /A DoY=d
if %m% == 2 set /A DoY=d+31
if %m% == 3 set /A DoY=d+59
if %m% == 4 set /A DoY=d+90
if %m% == 5 set /A DoY=d+120
if %m% == 6 set /A DoY=d+151
if %m% == 7 set /A DoY=d+181
if %m% == 8 set /A DoY=d+212
if %m% == 9 set /A DoY=d+243
if %m% == 10 set /A DoY=d+273
if %m% == 11 set /A DoY=d+304
if %m% == 12 set /A DoY=d+334

REM Schaltjahr?
set /A LY=(y/4)*4
if %y% NEQ %LY% goto noLY
if %m% GTR 2 set /A DoY=DoY+1

:noLY
REM Tag der Woche (Sonntag = 0)
for /f %%g in ('wmic path win32_localtime get dayofweek^|findstr /v /r "^$"') do (set DoW=%%g)  
REM (Sonntag = 7)
if %DoW% == 0 set /A DoW=7

REM KW
set /A nSd=DoY+(7-DoW)
set /A KW=nSd/7
set /A delta=nSd-(KW*7)
if %delta% GTR 3 set /A KW=KW+1

REM führedne Null
if %KW% LSS 10 set O=0

echo.KW = %O%%KW%

PAUSE
chcp 850>nul
endlocal
EXIT
RoadRacer82
RoadRacer82 23.10.2016 um 14:53:39 Uhr
Goto Top
Vorgehen:
Tag des Jahres berechnen ,im falle von von Schaltjahren +1 (ab März).
Tag des Jahres zum nächsten Sonntag "aufrunden" und Anzahl der ganzen Wochen berechnen (Batch rundet ja immer ab).
Delta (Tage von Jahresbeginn zu Wochenanfang) berechnen, wenn Delta > 3 dann Wochen+1 (weil dann die angefangene ja Woche mitzählt).
Führende 0 einfügen wenn KW < 10.
Es bleibt der Makel von KW = 00 z.B. für die ersten 3 Tage diesen Jahres.
Wenn ich mal wieder Langeweile habe wird dann KW 52/53 und als zusätzliche Information das Vorjahr angezeigt.
rubberman
rubberman 23.10.2016 um 15:20:09 Uhr
Goto Top
Hallo RoadRacer82.

Der Thread ist uralt und das Problem ist rein mathematisch und wurde längst gelöst.
ritchielawrence.github.io/batchfunctionlibrary/
@echo off &setlocal

set /a "yy=2016,mm=10,dd=23"  
call :DateToWeek %yy% %mm% %dd% yn cw dw
echo Jahr %yn%
echo Woche %cw%
echo Tag der Woche %dw%
pause
exit /b

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: 
 :DateToWeek %yy% %mm% %dd% yn cw dw
 ::
 :: By:   Ritchie Lawrence, Updated 2002-11-20. Version 1.1
 ::
 :: Func: Returns an ISO 8601 Week date from a calendar date.
 ::       For NT4/2000/XP/2003.
 :: 
 :: Args: %1 year component to be converted, 2 or 4 digits (by val)
 ::       %2 month component to be converted, leading zero ok (by val)
 ::       %3 day of month to be converted, leading zero ok (by val)
 ::       %4 var to receive year, 4 digits (by ref)
 ::       %5 var to receive calendar week, 2 digits, 01 to 53 (by ref)
 ::       %6 var to receive day of week, 1 digit, 1 to 7 (by ref)
 :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
 setlocal ENABLEEXTENSIONS
 set yy=%1&set mm=%2&set dd=%3
 if 1%yy% LSS 200 if 1%yy% LSS 170 (set yy=20%yy%) else (set yy=19%yy%)
 set /a dd=100%dd%%%100,mm=100%mm%%%100
 set /a z=14-mm,z/=12,y=yy+4800-z,m=mm+12*z-3,Jd=153*m+2
 set /a Jd=Jd/5+dd+y*365+y/4-y/100+y/400-32045
 set /a y=yy+4798,Jp=y*365+y/4-y/100+y/400-31738,t=Jp+3,Jp=t-t%%7
 set /a y=yy+4799,Jt=y*365+y/4-y/100+y/400-31738,t=Jt+3,Jt=t-t%%7
 set /a y=yy+4800,Jn=y*365+y/4-y/100+y/400-31738,t=Jn+3,Jn=t-t%%7
 set /a Jr=%Jp%,yn=yy-1,yn+=Jd/Jt,yn+=Jd/Jn
 if %Jd% GEQ %Jn% (set /a Jr=%Jn%) else (if %Jd% GEQ %Jt% set /a Jr=%Jt%)
 set /a diff=Jd-Jr,cw=diff/7+1,wd=diff%%7,wd+=1
 if %cw% LSS 10 set cw=0%cw%
 endlocal&set %4=%yn%&set %5=%cw%&set %6=%wd%&goto :EOF
 :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
Grüße
rubberman