mhi-lct
Goto Top

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!

@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
Kommentar vom Moderator Biber am Apr 06, 2011 um 16:42:41 Uhr
[Edit] Codeformatierung. [/Edit]

Content-Key: 164102

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

Printed on: April 24, 2024 at 13:04 o'clock

Member: bastla
bastla Apr 06, 2011, updated at Oct 18, 2012 at 16:46:23 (UTC)
Goto Top
Hallo MHI-LCT und willkommen im Forum!

Schön, dass Du gleich mit einem Tipp als Forumsmitglied "einsteigst" face-smile - 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:
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  
- und da Du ja auch nach Verbesserungsvorschlägen fragtest: einen habe ich hier eingebaut. face-wink

Noch einer: Anstelle von
set /a c=!c!+1
könntest Du kürzer
set /a c+=1
schreiben ...

Grüße
bastla
Member: rubberman
rubberman Apr 09, 2011 at 14:01:59 (UTC)
Goto Top
Hallo Zusammen,

darf ich mitspielen ? face-wink

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
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 face-wink
Bei der Gelegenheit habe ich die Variablen in Zeile 100 noch gerade gerückt.
</edit>
Member: Biber
Biber Apr 09, 2011 at 19:32:03 (UTC)
Goto Top
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:
  ┌──────────────────────────────────┐
  │                                  │
  │  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
Member: bastla
bastla Apr 10, 2011 at 16:16:19 (UTC)
Goto Top
Hallo rubberman!
darf ich mitspielen ? face-wink
"Spielen" ist genau das richtige Wort face-wink ...

... und das Ergebnis kann sich sehen lassen (hybsch ist es dabei auch noch). face-smile

Grüße
bastla
Member: rubberman
rubberman Apr 10, 2011 at 16:53:15 (UTC)
Goto Top
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 ...
@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
... 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 face-wink

Grüße
rubberman
Member: bastla
bastla Apr 10, 2011 at 17:01:56 (UTC)
Goto Top
Hallo rubberman!
Die Schaltjahrbehandlung von MHI-LCT scheint mir zudem auch falsch zu sein.
da gab's noch eine Regel, wie volle Jahrhunderte zu behandeln sind face-wink
Deshalb hat MHI-LCT ja auch die Einschränkung auf sollte bis ins jahr 2099 passen vorgenommen ...

... 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 ... face-wink

Grüße
bastla
Member: rubberman
rubberman Apr 10, 2011 at 17:10:14 (UTC)
Goto Top
Zitat von @bastla:
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
Member: Biber
Biber Apr 10, 2011 at 17:51:55 (UTC)
Goto Top
{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
... face-wink
Oder war es vielleicht die Teilbarkeit durch 100, aber nicht durch 400? *grybel*
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]
Member: MHI-LCT
MHI-LCT Apr 11, 2011 at 06:53:45 (UTC)
Goto Top
Oh, hier ist ja eine ganz schöne Diskussion entbrannt! ;)
Damit habe ich nun nicht gerechnet!

Und ja, mir ist bewusst, dass Vielfache von 100 keine Schaltjahre sind obwohl sie auch durch 4 teilbar sind und Vielfache von 400 wieder doch Schaltjahre darstellen, obwohl sie durch 100 teilbar sind! ;) Das liegt wohl daran, dass die Erde nicht ganz "rund" um die Sonne kreist und nochdazu, nach einer umrundung, unsere Kugel nicht wieder in der "0:00Uhr-Ausgangsposition" angekommen ist, sondern etwa 6Std, nen paar minuten und sekunden daneben. Daher auch das Schaltjahr alle 4 Jahre. (4*6Std = 24Std => 1Tag)

Dazu fällt mir ein, dass ich mal eine Funktion geschrieben hatte, die den Geburtstag von "29.Feb"-Kandidaten auf den entsprechenden Tag umrechnet. Also die Dauer der Erdumrundung um die Sonne als 1Jahr annimmt und so festlegt, wann die Erde wieder an der Stelle steht, als der Mensch geboren wurde und den entsprechenden Tag dazu ermittelt. Ist hin und wieder der 28.02 und manchmal eben der 01.03. Es sei denn es ist ein Schaltjahr. face-smile
Wenn ich es noch wieder finde, poste ich es mal.

Gruß, MHI

<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>
Member: Skyemugen
Skyemugen Apr 11, 2011 at 14:24:31 (UTC)
Goto Top
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>

Aloha, [OT]

was ist denn eine Ainimation? Du musst da echt mal Langeweile gehabt haben *g*

greetz André