Wochentag ermitteln
Hallo,
da ich hier beim Erstellen meines Sharepoint Backup Batches viel gelesen und gelernt habe, wollte ich nun auf diesem Wege einen Teil davon zur Verfügung stellen.
Das Script ermittelt den aktuellen Wochentag auf der Kommandozeile und sollte bis ins jahr 2099 passen, da ich nur einfche schaltjahr-Überprüfung genutzt habe. Natürlich freue ich mich auch über Verbesserungsvorschläge und anderweitige Kommentare!
da ich hier beim Erstellen meines Sharepoint Backup Batches viel gelesen und gelernt habe, wollte ich nun auf diesem Wege einen Teil davon zur Verfügung stellen.
Das Script ermittelt den aktuellen Wochentag auf der Kommandozeile und sollte bis ins jahr 2099 passen, da ich nur einfche schaltjahr-Überprüfung genutzt habe. Natürlich freue ich mich auch über Verbesserungsvorschläge und anderweitige Kommentare!
@echo off
:: ##################
:: datum ermitteln
:: und d,m,y zuweisen
:: ##################
date /T > d.txt
for /f "tokens=1,2,3 delims=. " %%i in (d.txt) do set /a y=%%k, m=%%j, d=%%i
del d.txt
:: ########################
:: variablen initialisieren
:: ########################
set /a c=0
set /a days=0
setlocal EnableDelayedExpansion
:: ##########################
:: Monate vom Jahresanfang
:: bis heute zusammenaddieren
:: ##########################
for %%i in (31,28,31,30,31,30,31,31,30,31,30,31) do (
set /a c=!c!+1
if %m% GTR !c! (set /a days=!days!+%%i)
set days=!days!
)
:: ########################
:: wenn Februar vorüber ist
:: und ein Schaltjahr +1
:: ########################
if %y%%%4==0 (
if %m% GTR 2 (set /a days=!days!+1))
:: #################################
:: Tage vom Monatsanfang aufaddieren
:: #################################
set /a days=!days!+%d%
:: ################################
:: Wochentag in b schreiben
:: Referenztag ist der 31.12.2000 (Sonntag)
:: 0 = Sonntag, 1 = Montag .... usw
:: ################################
set /a b=(((%y%-2001)/4+(%y%-2001)*365)+%days%)%%7
if %b%==0 echo Es ist Sonntag, der %d%.%m%.%y%
if %b%==1 echo Es ist Montag, der %d%.%m%.%y%
if %b%==2 echo Es ist Dienstag, der %d%.%m%.%y%
if %b%==3 echo Es ist Mittwoch, der %d%.%m%.%y%
if %b%==4 echo Es ist Donnerstg, der %d%.%m%.%y%
if %b%==5 echo Es ist Freitag, der %d%.%m%.%y%
if %b%==6 echo Es ist Samstag, der %d%.%m%.%y%
endlocal
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Kommentar vom Moderator Biber am 06.04.2011 um 18:42:41 Uhr
[Edit] Codeformatierung. [/Edit]
Content-ID: 164102
Url: https://administrator.de/knowledge/wochentag-ermitteln-164102.html
Ausgedruckt am: 09.04.2025 um 11:04 Uhr
10 Kommentare
Neuester Kommentar
Hallo MHI-LCT und willkommen im Forum!
Schön, dass Du gleich mit einem Tipp als Forumsmitglied "einsteigst"
- auch wenn es zum Thema schon diverse Ansätze zu finden gibt (zB Workshop Batch for Runaways - Part III - Datums- und Zeitvariablen im Batch) ...
Eine Fastenzeit-Version hätte ich auch noch zu bieten:
- und da Du ja auch nach Verbesserungsvorschlägen fragtest: einen habe ich hier eingebaut. 
Noch einer: Anstelle von
könntest Du kürzer
schreiben ...
Grüße
bastla
Schön, dass Du gleich mit einem Tipp als Forumsmitglied "einsteigst"
Eine Fastenzeit-Version hätte ich auch noch zu bieten:
set G=%temp%\GetWeekDayName.vbs
>%G% echo WScript.Echo WeekDayName(WeekDay(Date))
for /f %%i in ('cscript //nologo %G%') do set "WTag=%%i"
del %G%
for /f "tokens=1-3 delims=." %%i in ('date /t') do echo Es ist %WTag%, der %%i.%%j.%%k
Noch einer: Anstelle von
set /a c=!c!+1
set /a c+=1
Grüße
bastla
Hallo Zusammen,
darf ich mitspielen ?
Kalenderelement per Batch:
Das Ding ist natürlich zum Einschlafen langsam, da ich versucht habe mich auf Batch pur zu beschränken ...
Grüße
rubberman
<edit>
@Biber
Danke für die Blumen
Bei der Gelegenheit habe ich die Variablen in Zeile 100 noch gerade gerückt.
</edit>
darf ich mitspielen ?
Kalenderelement per Batch:
@echo off &setlocal enabledelayedexpansion &color f1 &title Kalender
:: erster Tag der Woche (0 für Montag ... 6 für Sonntag)
set /a fDoW=0
:: Variablen vordefinieren
set /a n=0
for %%a in (Mo Di Mi Do Fr Sa So) do (
set "wd_!n!=%%a"
set /a n+=1
)
set /a n=0
for %%a in (
Januar Februar Maerz April Mai Juni Juli August September Oktober November Dezember
) do (
set /a n+=1
set "m_!n!=%%a"
set "nm_%%a=!n!"
)
:: hole Jahr, Monat und Tag des derzeitigen Datums
call :GetDate cyy cmm cdd
set /a yy=cyy,mm=cmm,dd=cdd
:mainloop
:: hole die Anzahl Tage des Monats
call :DaysPerMonth %yy% %mm% DpM
:: hole den Wochentag des ersten Tags im Monat
call :DayOfWeek %yy% %mm% 1 %fDoW% DoW
:: Variable vordefinieren
set /a neededCells=DpM+DoW
:: hole den Monatsname
call :MonthName %mm% mmmm
:: erstelle den Inhalt der Kalendertabelle
set "header=%mmmm% %yy% "
set "header=%header:~,32%"
for /l %%a in (1,1,7) do (
call :createWeekday %%a wd
set "w_%%a=!wd!"
)
for /l %%a in (1,1,42) do (
call :createCell %%a cell
set "c_%%a=!cell!"
)
:choiceloop
:: Kalendertabelle ausgeben
cls
echo(
echo(
echo( ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
echo( ³ ³
echo( ³ %header%³
echo( ³ ³
echo( ÃÄÄÄÄÂÄÄÄÄÂÄÄÄÄÂÄÄÄÄÂÄÄÄÄÂÄÄÄÄÂÄÄÄÄ´
echo( ³%w_1%³%w_2%³%w_3%³%w_4%³%w_5%³%w_6%³%w_7%³
echo( ÃÄÄÄÄÅÄÄÄÄÅÄÄÄÄÅÄÄÄÄÅÄÄÄÄÅÄÄÄÄÅÄÄÄÄ´
echo( ³%c_1%³%c_2%³%c_3%³%c_4%³%c_5%³%c_6%³%c_7%³
echo( ³%c_8%³%c_9%³%c_10%³%c_11%³%c_12%³%c_13%³%c_14%³
echo( ³%c_15%³%c_16%³%c_17%³%c_18%³%c_19%³%c_20%³%c_21%³
echo( ³%c_22%³%c_23%³%c_24%³%c_25%³%c_26%³%c_27%³%c_28%³
echo( ³%c_29%³%c_30%³%c_31%³%c_32%³%c_33%³%c_34%³%c_35%³
echo( ³%c_36%³%c_37%³%c_38%³%c_39%³%c_40%³%c_41%³%c_42%³
echo( ÀÄÄÄÄÁÄÄÄÄÁÄÄÄÄÁÄÄÄÄÁÄÄÄÄÁÄÄÄÄÁÄÄÄÄÙ
echo(
echo(
echo(ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
:: choice
set "month="
echo Springe zu Monat M oder MMMM oder M YYYY oder MMMM YYYY
echo r (Reset), e (Exit)
echo(
set /p "month=Eingabe: "
if not defined month goto choiceloop
if /i "%month:~,1%"=="e" goto :eof
if /i "%month:~,1%"=="r" set "month=%cmm% %cyy%"
call :change %month% &goto mainloop
:: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ End Of Main ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
:GetDate yOut mOut dOut
:: Output: Jahr, Monat und Tag ohne vorangestellte Nullen
setlocal
for /f "tokens=3" %%a in ('reg query "HKCU\Control Panel\International" /v iDate') do set "iDate=%%a"
for /f "tokens=3" %%a in ('reg query "HKCU\Control Panel\International" /v sDate') do set "sDate=%%a"
for /f "tokens=2" %%i in ("%date%") do set "date=%%i"
for /f "tokens=1-3 delims=%sDate%" %%a in ("%date%") do (
if %iDate%==0 set /a mm=100%%a%%100,dd=100%%b%%100,yy=10000%%c%%10000
if %iDate%==1 set /a dd=100%%a%%100,mm=100%%b%%100,yy=10000%%c%%10000
if %iDate%==2 set /a yy=10000%%a%%10000,mm=100%%b%%100,dd=100%%c%%100
)
endlocal &set "%~1=%yy%" &set "%~2=%mm%" &set "%~3=%dd%"
goto :eof
:DaysPerMonth yyyyIn mmIn numOut
:: Output: Anzahl Tage des übergebenen Monats.
setlocal
set /a yy=10000%~1%%10000,mm=100%~2%%100
if %yy% lss 100 set /a yy+=2000
set /a jd=31-32075+1461*(yy+4800+(mm-14)/12)/4+367*(mm-2-(mm-14)/12*12)/12-3*((yy+4900+(mm-14)/12)/100)/4
set /a l=jd+68569,n=4*l/146097,l=l-(146097*n+3)/4,i=4000*(l+1)/1461001,l=l-1461*i/4+31,j=80*l/2447,k=l-2447*j/80,x=31-k
if %x%==0 set "x=31"
endlocal &set "%~3=%x%"
goto :eof
:DayOfWeek yyyyIn mmIn ddIn firstDayOfWeekIn numOut
:: für Input: firstDayOfWeekIn ist 0 wenn Montag ... 6 wenn Sonntag
:: Output: 0 (erster Tag der Woche) ... 6 (letzter Tag der Woche)
setlocal
set /a yy=10000%~1%%10000,mm=100%~2%%100,dd=100%~3%%100
if %yy% lss 100 set /a yy+=2000
set /a z=14-mm,z/=12,y=yy+4800-z,m=mm+12*z-3,DoW=153*m+2,DoW=DoW/5+dd+y*365+y/4-y/100+y/400-2472630-%~4,DoW%%=7
endlocal &set "%~5=%DoW%"
goto :eof
:MonthName mmIn mmmmOut
:: Output: Monatsname (String) des übergebenen Monats (Zahl).
setlocal enabledelayedexpansion
set /a mm=100%~1%%100
set "mmmm=!m_%mm%!"
endlocal &set "%~2=%mmmm%"
goto :eof
:createWeekday
setlocal enabledelayedexpansion
:: Erstellt den Wochentag abhängig von der fDoW Einstellung.
set /a x=%~1+fDoW-1,x%%=7
set "wd=!wd_%x%!"
endlocal &set "%~2= %wd% "
goto :eof
:createCell
:: Erstellt den Inhalt der Zellen der Kalendertabelle.
setlocal enabledelayedexpansion
set "cell= "
set /a day=%~1-DoW
if %1 gtr %DoW% (
if %~1 leq %neededCells% (
set "sday= %day%"
set "cell= !sday:~-2! "
if %day%==%dd% (
if %mm%==%cmm% (
if %yy%==%cyy% (
set "cell=*!sday:~-2!*"
)
)
)
)
)
endlocal &set "%~2=%cell%
goto :eof
:change
:: Ändert den Monat
setlocal enabledelayedexpansion
set "m=" &set "y="
for /f "tokens=1,2" %%a in ("%~1 %~2") do (set "m=%%a" &set "y=%%b")
set "nm=!nm_%m%!"
if defined nm (
set /a mm=nm
) else (
set /a m=100!m!%%100 2>nul
if !m! gtr 0 (if !m! lss 13 set /a mm=m)
)
if defined y (
set /a y=y 2>nul
if !y! geq 1900 if !y! leq 2100 set /a yy=y
)
endlocal &set "mm=%mm%" &set "yy=%yy%"
goto :eof
Grüße
rubberman
<edit>
@Biber
Danke für die Blumen
Bei der Gelegenheit habe ich die Variablen in Zeile 100 noch gerade gerückt.
</edit>
Moin rubberman,
und natürlich auch moin MHI-LCT und moin bastla,
das ist doch wirklich eine sehr nette Fingerübung.
Die werde gern weiterempfehlen.
Weil der Charme deines MacGuwyer-Kalenders ja gar nicht richtig rüberkommt ohne den Output, trage ich den mal nach:
Danke für dieses Beispiel.
Biber
und natürlich auch moin MHI-LCT und moin bastla,
das ist doch wirklich eine sehr nette Fingerübung.
Die werde gern weiterempfehlen.
Weil der Charme deines MacGuwyer-Kalenders ja gar nicht richtig rüberkommt ohne den Output, trage ich den mal nach:
┌──────────────────────────────────┐
│ │
│ November 2066 │
│ │
├────┬────┬────┬────┬────┬────┬────┤
│ Mo │ Di │ Mi │ Do │ Fr │ Sa │ So │
├────┼────┼────┼────┼────┼────┼────┤
│ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │
│ 8 │ 9 │ 10 │ 11 │ 12 │ 13 │ 14 │
│ 15 │ 16 │ 17 │ 18 │ 19 │ 20 │ 21 │
│ 22 │ 23 │ 24 │ 25 │ 26 │ 27 │ 28 │
│ 29 │ 30 │ │ │ │ │ │
│ │ │ │ │ │ │ │
└────┴────┴────┴────┴────┴────┴────┘
───────────────────────────────────────
Springe zu Monat M oder MMMM oder M YYYY oder MMMM YYYY
r (Reset), e (Exit)
Eingabe:
Danke für dieses Beispiel.
Biber
Danke, bastla.
Natürlich ist das nur Spielerei. Andererseits kann man sich einzelne Funktionen des Codes zu Nutze machen um ähnliche Lösungen zu entwickeln. So sollte dies ...
... in etwa das ausgeben, was MHI-LCT und Du mit euren Codes bezweckt.
Schwierig ist bei Batchlösungen immer die unterschiedliche Formatierung des Datums. Ich hab's mal mit dem Lesen der Registry versucht, um das Datum möglichst richtig aufzudröseln.
Die Schaltjahrbehandlung von MHI-LCT scheint mir zudem auch falsch zu sein. Es sind eben nicht alle dur 4 ganzzahlig teilbaren Jahre Schaltjahre, da gab's noch eine Regel, wie volle Jahrhunderte zu behandeln sind
Grüße
rubberman
Natürlich ist das nur Spielerei. Andererseits kann man sich einzelne Funktionen des Codes zu Nutze machen um ähnliche Lösungen zu entwickeln. So sollte dies ...
@echo off &setlocal enabledelayedexpansion
:: Variablen vordefinieren
set /a n=0
for %%a in (Montag Dienstag Mittwoch Donnerstag Freitag Samstag Sonntag) do (
set "wd_!n!=%%a"
set /a n+=1
)
:: hole Jahr, Monat und Tag des derzeitigen Datums
call :GetDate yy mm dd
:: hole den Wochentag des derzeitigen Datums
call :DayOfWeek %yy% %mm% %dd% 0 DoW
:: Ausgabe
echo Es ist !wd_%DoW%!, der %dd%.%mm%.%yy%.
pause>nul
goto :eof
:: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ End Of Main ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
:GetDate yOut mOut dOut
:: Output: Jahr, Monat und Tag ohne vorangestellte Nullen
setlocal
for /f "tokens=3" %%a in ('reg query "HKCU\Control Panel\International" /v iDate') do set "iDate=%%a"
for /f "tokens=3" %%a in ('reg query "HKCU\Control Panel\International" /v sDate') do set "sDate=%%a"
for /f "tokens=2" %%i in ("%date%") do set "date=%%i"
for /f "tokens=1-3 delims=%sDate%" %%a in ("%date%") do (
if %iDate%==0 set /a mm=100%%a%%100,dd=100%%b%%100,yy=10000%%c%%10000
if %iDate%==1 set /a dd=100%%a%%100,mm=100%%b%%100,yy=10000%%c%%10000
if %iDate%==2 set /a yy=10000%%a%%10000,mm=100%%b%%100,dd=100%%c%%100
)
endlocal &set "%~1=%yy%" &set "%~2=%mm%" &set "%~3=%dd%"
goto :eof
:DayOfWeek yyyyIn mmIn ddIn firstDayOfWeekIn numOut
:: für Input: firstDayOfWeekIn ist 0 wenn Montag ... 6 wenn Sonntag
:: Output: 0 (erster Tag der Woche) ... 6 (letzter Tag der Woche)
setlocal
set /a yy=10000%~1%%10000,mm=100%~2%%100,dd=100%~3%%100
if %yy% lss 100 set /a yy+=2000
set /a z=14-mm,z/=12,y=yy+4800-z,m=mm+12*z-3,DoW=153*m+2,DoW=DoW/5+dd+y*365+y/4-y/100+y/400-2472630-%~4,DoW%%=7
endlocal &set "%~5=%DoW%"
goto :eof
Schwierig ist bei Batchlösungen immer die unterschiedliche Formatierung des Datums. Ich hab's mal mit dem Lesen der Registry versucht, um das Datum möglichst richtig aufzudröseln.
Die Schaltjahrbehandlung von MHI-LCT scheint mir zudem auch falsch zu sein. Es sind eben nicht alle dur 4 ganzzahlig teilbaren Jahre Schaltjahre, da gab's noch eine Regel, wie volle Jahrhunderte zu behandeln sind
Grüße
rubberman
Hallo rubberman!
... und obwohl natürlich auch die Überprüfung der restlosen Teilbarkeit durch 100 und dann durch 400 sicher auch für ihn kein Problem wäre, gehe ich stark davon aus, dass sein Batch kein "Jahr 2400-Problem" verursachen wird ...
Grüße
bastla
Die Schaltjahrbehandlung von MHI-LCT scheint mir zudem auch falsch zu sein.
da gab's noch eine Regel, wie volle Jahrhunderte zu behandeln sind
Deshalb hat MHI-LCT ja auch die Einschränkung auf sollte bis ins jahr 2099 passen vorgenommen ...da gab's noch eine Regel, wie volle Jahrhunderte zu behandeln sind
... und obwohl natürlich auch die Überprüfung der restlosen Teilbarkeit durch 100 und dann durch 400 sicher auch für ihn kein Problem wäre, gehe ich stark davon aus, dass sein Batch kein "Jahr 2400-Problem" verursachen wird ...
Grüße
bastla
Zitat von @bastla:
Deshalb hat MHI-LCT ja auch die Einschränkung auf sollte bis ins jahr 2099 passen vorgenommen ...
Deshalb hat MHI-LCT ja auch die Einschränkung auf sollte bis ins jahr 2099 passen vorgenommen ...
OOOPS, hab ich überlesen, sorry MHI-LCT. Ja dann...
Grüße
rubberman
{OT]
Moin bastla, rubberman und alle anderen unbeschwert Spielenden,
Aber die gute Nachricht ist: es wird wahrscheinlich in der Tat kein "Jahr-2400-Problem" geben.
Der gemeinsam von den Mayas, Roland Emmerich und TEPCO entwickelte Kalender endet im Jahr 2012,
Das allerdings ist ein auch der Batchprogrammierung zu berücksichtigendes Schaltjahr.
Grüße und schönen Restsonntag
[/OT]
Moin bastla, rubberman und alle anderen unbeschwert Spielenden,
Zitat von @bastla:
... und obwohl natürlich auch die Überprüfung der restlosen Teilbarkeit durch 100 und dann durch 400 sicher auch
für ihn kein Problem wäre, gehe ich stark davon aus, dass sein Batch kein "Jahr 2400-Problem" verursachen wird
...
Oder war es vielleicht die Teilbarkeit durch 100, aber nicht durch 400? *grybel*... und obwohl natürlich auch die Überprüfung der restlosen Teilbarkeit durch 100 und dann durch 400 sicher auch
für ihn kein Problem wäre, gehe ich stark davon aus, dass sein Batch kein "Jahr 2400-Problem" verursachen wird
...
Aber die gute Nachricht ist: es wird wahrscheinlich in der Tat kein "Jahr-2400-Problem" geben.
Der gemeinsam von den Mayas, Roland Emmerich und TEPCO entwickelte Kalender endet im Jahr 2012,
Das allerdings ist ein auch der Batchprogrammierung zu berücksichtigendes Schaltjahr.
Grüße und schönen Restsonntag
[/OT]
Zitat von @MHI-LCT:
<edit>
Dazu fällt mir jetzt grade noch ein "Schmarn" ein, den ich mal aus langer Weile programmiert hatte:
http://halfadayinnorway.ha.funpic.de/rot.html
</edit>
<edit>
Dazu fällt mir jetzt grade noch ein "Schmarn" ein, den ich mal aus langer Weile programmiert hatte:
http://halfadayinnorway.ha.funpic.de/rot.html
</edit>
Aloha, [OT]
was ist denn eine Ainimation? Du musst da echt mal Langeweile gehabt haben *g*
greetz André