progfreund
Goto Top

Batch If Abfrage wird übersprungen oder gibt immer else wieder. Variable ist trotz set undefined.

Hallo.

Ich habe eine batch geschrieben, die zu einem Datum den zugehörigen Wochentag ermittelt
gemaess gregorianischem Kalender.

Mein Problem ist:
  • die If Abfrage %DatumMonatsZahl% in Zeilen 86-89 wird übersprungen,
  • die If Abfrage zum Schaltjahr in Zeilen 173-196 wird immer mit else wiedergegeben,
  • die Variable SchaltjahrsMoeglichkeit in Zeilen 128 und 136 definiert (bei Monaten Januar und Februar, d.h. 1 und 2), ist in Zeile 208 undefined.

Ich habe mir schon die Threads Doppelte If-Abfrage funktioniert nicht
angeschaut, aber ich denke, hier ist noch ein anderer Fehler.

Bitte um Vorschläge.

Skript:
@echo off
title Wochentag bestimmen

:Anfang
echo.
echo  ===============================================================
echo ^|                                                               ^|
echo ^| Dieses Programm gibt gemaess dem gregorianischen Kalender     ^|
echo ^| die Wochentage entsprechend dem Datum an.                     ^|
echo ^|                                                               ^|
echo ^| Geben Sie ein Datum nach folgendem Beispiel ein:              ^|
echo ^| TagTag.MonatMonat.JahrJahrJahrJahr (TT.MM.JJJJ)               ^|
echo ^| wie 21.01.1990                                                ^|
echo ^|                                                               ^|
echo  ===============================================================
echo.
echo.
set /p "Datum=Wie lautet ihr Datum? "  
echo.
echo Ihr Datum lautet: "%Datum%"  
echo.
echo.
echo.
echo Wiedergabe der eingegebenen Zeichen (max. 10):
echo.
echo Zeichen  1: "%Datum:~0,1%"   Zeichen  6: "%Datum:~5,1%"  
echo Zeichen  2: "%Datum:~1,1%"   Zeichen  7: "%Datum:~6,1%"  
echo Zeichen  3: "%Datum:~2,1%"   Zeichen  8: "%Datum:~7,1%"  
echo Zeichen  4: "%Datum:~3,1%"   Zeichen  9: "%Datum:~8,1%"  
echo Zeichen  5: "%Datum:~4,1%"   Zeichen 10: "%Datum:~9,1%"  
echo.
echo.
echo.

:DatumFormatieren
If "%Datum:~0,1%" equ "0" (  
set "DatumTageszahl=%Datum:~1,1%"  
) else (
set "DatumTageszahl=%Datum:~0,2%"  
)
If "%Datum:~3,1%" equ "0" (  
set "DatumMonatszahl=%Datum:~4,1%"  
) else (
set "DatumMonatszahl=%Datum:~3,2%"  
)
If "%Datum:~6,1%" equ "0" (  
set "DatumJahrhundertszahl=%Datum:~7,1%"  
) else (
set "DatumJahrhundertszahl=%Datum:~6,2%"  
)
If "%Datum:~8,1%" equ "0" (  
set "DatumJahreszahl=%Datum:~9,1%"  
) else (
set "DatumJahreszahl=%Datum:~8,2%"  
)
echo Um auch Eingaben mit voranstehender Null
echo wie zum Beispiel 01.01.0908 in der
echo Datumseingabe zu verarbeiten, wird
echo das Datum formatiert.
echo.
echo Das Datum wurde wie folgt formatiert:
echo.
set "DatumJahrtausendszahl=%DatumJahrhundertszahl%%DatumJahreszahl%"  
echo Die DatumTageszahl "%DatumTageszahl%"  
echo Die DatumMonatszahl "%DatumMonatszahl%"  
echo Die DatumJahrhundertszahl "%DatumJahrhundertszahl%"  
echo Die DatumJahreszahl "%DatumJahreszahl%"  
echo Die DatumJahrtausendszahl "%DatumJahrtausendszahl%"  
echo.
echo.
echo.

:Ueberpruefung
echo Es werden nun die Eingaben ueberprueft:
echo Es sollten vier korrekte Meldungen erscheinen,
echo je eine fuer die Tageszahl, die Monatszahl, die
echo Jahrhundertszahl und die Jahreszahl.
echo.
If "%DatumTageszahl%" leq "31" (  
If "%DatumTageszahl%" geq "1" (  
echo Die Tageszahl wurde korrekt eingegeben.
)
) else (
echo Die Tageszahl wurde nicht korrekt eingegeben.
)
If "%DatumMonatszahl%" leq "12" (  
If "%DatumMonatszahl%" geq "1" (  
echo Die Monatszahl wurde korrekt eingegeben.
)
) else (
echo Die Monatszahl wurde nicht korrekt eingegeben.
)
If "%DatumJahrhundertszahl%" leq "99" (  
If "%DatumJahrhundertszahl%" geq "1" (  
echo Die Jahrhundertszahl wurde korrekt eingegeben.
)
) else (
echo Die Jahrhundertszahl wurde nicht korrekt eingegeben.
)
If "%DatumJahreszahl%" leq "99" (  
If "%DatumJahreszahl%" geq "1" (  
echo Die Jahreszahl wurde korrekt eingegeben.
)
) else (
echo Die Jahreszahl wurde nicht korrekt eingegeben.
)
echo.
echo.
echo.
echo Fuer die Berechnung des Wochentages ist es notwendig,
echo das eingegebene Datum zu verrechnen.
echo Es werden nun nacheinander die einzelnen Werte fuer
echo die Tageszahl, die Monatszahl, die Jahrhundertszahl und
echo die Jahreszahl berechnet bzw. bestimmt.
echo.
echo.

:Tagberechnen
echo Es wird nun die Tageszahl des Datums umgerechnet.
set /a "TagesRest=%DatumTageszahl%%%7"  
echo Die TagesRest Zahl betraegt: "%TagesRest%"  
echo.

:Monatberechnen
echo Es wird nun die Monatszahl des Datums bestimmt.
If "%DatumMonatszahl%" equ "1" (  
set "MonatsRest=0"  
set "SchaltjahrsMoeglichkeit=1"  
)
If "%SchaltjahrsMoeglichkeit%" equ "1" (  
echo  * Fuer den Monat Januar wurde die
echo  * Schaltjahrsmoeglichkeit auf 1 gesetzt.
)
If "%DatumMonatszahl%" equ "2" (  
set "MonatsRest=3"  
set "SchaltjahrsMoeglichkeit=1"  
)
If "%SchaltjahrsMoeglichkeit%" equ "1" (  
echo  * Es lag im Februar bereits eine Schaltjahrsmoeglichkeit
echo  * vor oder wurde angelegt.
)
If "%DatumMonatszahl%" equ "3" set "MonatsRest=3"  
If "%DatumMonatszahl%" equ "4" set "MonatsRest=6"  
If "%DatumMonatszahl%" equ "5" set "MonatsRest=1"  
If "%DatumMonatszahl%" equ "6" set "MonatsRest=4"  
If "%DatumMonatszahl%" equ "7" set "MonatsRest=6"  
If "%DatumMonatszahl%" equ "8" set "MonatsRest=2"  
If "%DatumMonatszahl%" equ "9" set "MonatsRest=5"  
If "%DatumMonatszahl%" equ "10" set "MonatsRest=0"  
If "%DatumMonatszahl%" equ "11" set "MonatsRest=3"  
If "%DatumMonatszahl%" equ "12" set "MonatsRest=5"  
echo Die MonatsRest Zahl betraegt: "%MonatsRest%"  
echo.

:Jahrberechnen
echo Es wird nun die Jahreszahl des Datums umgerechnet.
set /a "JahresRest=%DatumJahreszahl%/4"  
set /a "JahresRest2=%DatumJahreszahl%+%JahresRest%"  
set /a "JahresRest2=%JahresRest2%%%7"  
echo Die JahresRest Zahl betraegt: "%JahresRest2%"  
echo.

:Jahrhundertberechnen
echo Es wird nun die Jahrhundertszahl des Datums umgerechnet.
set /a "JahrhundertsRest=%DatumJahrhundertszahl%%%4"  
set /a "JahrhundertsRest2=3-%JahrhundertsRest%"  
set /a "JahrhundertsRest2=%JahrhundertsRest2%*2"  
echo Die JahrhundertsRest Zahl betraegt: "%JahrhundertsRest2%"  
echo.

:Schaltjahrberechnen
echo Es wird nun geprueft, ob ein Schaltjahr vorliegt.
If "%DatumJahrtausendszahl%%%4" equ "0" (  
If "%DatumJahrtausendszahl%%%100" equ "0" (  
If "%DatumJahrtausendszahl%%%400" equ "0" (  
set "Schaltjahr=1"  
echo Die Jahrtausendszahl ist durch 4, 100 und 400 teilbar.
echo Daher liegt ein Schaltjahr vor.
goto Wochentagberechnen
)
) else (
set "Schaltjahr=0"  
echo Die Jahrtausendszahl ist durch 4 und durch 100, aber nicht
echo durch 400 teilbar. Daher liegt kein Schaltjahr vor.
goto Wochentagberechnen
)
set "Schaltjahr=1"  
echo Die Jahrtausendszahl ist durch 4 teilbar, aber nicht durch 100
echo und nicht durch 400. Daher liegt ein Schaltjahr vor.
goto Wochentagberechnen
) else (
set "Schaltjahr=0"  
echo Die Jahrtausendszahl ist nicht durch 4 teilbar.
echo Daher liegt kein Schaltjahr vor.
goto Wochentagberechnen
)

:Wochentagberechnen
echo.
echo.
echo.
echo -----------------------------------------------------------------
echo.
echo Es wird nun der Wochentag berechnet durch Addition der
echo einzelnen Summanden und anschliessender Modulo
echo Division durch 7.
echo.
If not defined SchaltjahrsMoeglichkeit (
set "SchaltjahrsMoeglichkeitsStatus=undefined"  
) else (
set "SchaltjahrsMoeglichkeitsStatus=defined "%SchaltjahrsMoeglichkeit%""  
)
echo Die Schaltjahrsmoeglichkeit liegt bei "%SchaltjahrsMoeglichkeitsStatus%"  
If "%Schaltjahr%" equ "1" (  
If "%SchaltjahrsMoeglichkeit%" equ "1" (  
set "Schaltjahrparameter=6"  
echo Schaltjahr aufgrund Monats fuer Berechnung bedeutsam.
)
) else (
set "Schaltjahrparameter=0"  
echo Schaltjahr Parameter fuer Berechnung nicht bedeutsam.
)
echo.
echo Ermittlung des Wochentags Rests: 
echo.
echo %%TagesRest%%
echo      +
echo %%MonatsRest%%
echo      +
echo %%JahresRest%%
echo      +
echo %%JahrhundertsRest%%
echo      +
echo %%Schaltjahrparameter%%
echo.
echo also:
echo.
echo %TagesRest%+%MonatsRest%+%JahresRest2%+%JahrhundertsRest2%+%Schaltjahrparameter%
echo.
set /a "WochentagsRest=%TagesRest%+%MonatsRest%+%JahresRest2%+%JahrhundertsRest2%+%Schaltjahrparameter%"  
set /a "WochentagsRest=%WochentagsRest%%%7"  
echo Die Summe der einzelnen Rest Werte nach der
echo Modulo Division ergibt "%WochentagsRest%"  
echo.
If "%WochentagsRest%" equ "0" set "Wochentag=Sonntag"  
If "%WochentagsRest%" equ "1" set "Wochentag=Montag"  
If "%WochentagsRest%" equ "2" set "Wochentag=Dienstag"  
If "%WochentagsRest%" equ "3" set "Wochentag=Mittwoch"  
If "%WochentagsRest%" equ "4" set "Wochentag=Donnerstag"  
If "%WochentagsRest%" equ "5" set "Wochentag=Freitag"  
If "%WochentagsRest%" equ "6" set "Wochentag=Samstag"  
echo Gemaess dem gregorianischen Kalender
echo ist dem Datum "%Datum%"  
echo der Wochentag "%Wochentag%"  
echo zugeordnet.
echo.

:End
set "Datum="  
set "DatumTageszahl="  
set "DatumMonatszahl="  
set "DatumJahrhundertszahl="  
set "DatumJahreszahl="  
set "DatumJahrtausendszahl="  
set "TagesRest="  
set "SchaltjahrsMoeglichkeit="  
set "MonatsRest="  
set "JahresRest="  
set "JahresRest2="  
set "JahrhundertsRest="  
set "JahrhundertsRest2="  
set "Schaltjahr="  
set "SchaltjahrsMoeglichkeitsStatus="  
set "Schaltjahrparameter="  
set "WochentagsRest="  
set "Wochentag="  
set "Wiederholung="  
echo.
echo Moechten Sie das Programm nochmal von vorne durchlaufen?
set /p "Wiederholung=Ja: [1] oder Nein: [2] ? "  
If "%Wiederholung%" equ "1" goto Anfang  
If "%Wiederholung%" equ "2" (  
echo.
echo Das Programm ist an seinem Ende.
echo.
)
pause
exit
Kommentar vom Moderator Biber am 25.05.2011 um 21:47:02 Uhr
Verschoben von "Entwicklung" nach "Batch & Shell".

Content-ID: 166749

Url: https://administrator.de/forum/batch-if-abfrage-wird-uebersprungen-oder-gibt-immer-else-wieder-variable-ist-trotz-set-undefined-166749.html

Ausgedruckt am: 22.12.2024 um 18:12 Uhr

Skyemugen
Skyemugen 23.05.2011 um 15:50:09 Uhr
Goto Top
Aloha,

dazu sage ich nur eines: Du vergleichst Zahlen miteinander aber formatierst die wie "Text".

(Das ist wie if "abc" lss "cde" ...)


ah, da war ja noch was mit einer Variable achso, nimm doch mal bitte den Alkohol weg (die Prozente) *gg*

if not defined SchaltjahrsMoeglichkeit

greetz André
Progfreund
Progfreund 23.05.2011 um 17:54:03 Uhr
Goto Top
@@Skyemugen
habe in Zeile 208
If not defined "%SchaltjahrsMoeglichkeit%" (
durch
If not defined SchaltjahrsMoeglichkeit (
ersetzt.

Danke André
Skyemugen
Skyemugen 23.05.2011 um 20:30:39 Uhr
Goto Top
Aloha,

ich antworte hier mal auf deine PM, da ich es unschön finde, Probleme intern zu lösen für öffentliche Anfragen.
Hallo, Skyemugen.

Danke für deinen Tipp die "%%" Zeichen bei If defined Variable wegzulassen.

Ich möchte dich fragen, wie kann ich denn in batch eine Variable als Zahl formatieren?
Und wie geht umgekehrt die Formatierung als String?

LG

In Batch eine Variable als Zahl formatieren, nun ich denke, du beziehst dich auf meine Anmerkung zu deinem if-Gedöns, also folgendes:

  • mit set /a Var= definierst du eine Zahl, das ist zwar bei einigen Datumsverwendungen nicht immer notwendig aber sicher ist sicher und man gewöhnt es sich an.
  • Zahlen sollten in einer IF-Abfrage ohne Zollzeichen gesetzt werden: z.B. If %DatumMonatszahl% leq 12 - dann funktioniert auch der Monat, wenn er mit einer NULL angegeben wird. (gilt auch für deine Zeilen 173 ff.)

Was genau du mit umgekehrter Formatierung als String meinst, ist mir unklar ...

Ich schätze, dein Code lässt sich eventuell noch einkürzen aber ... momentan fehlt mir die Luft, den Code genauer durchzusehen und zu optimieren ;)

greetz André
bastla
bastla 23.05.2011 um 23:03:15 Uhr
Goto Top
@Skyemugen
Ich beschränke mich auch auf den Vorschlag, "setlocal" an den Anfang zu setzen und dafür die Zeilen 259 - 277 ersatzlos zu streichen bzw uf den Hinweis, dass Berechnungsergebnisse in einer Variablen gespeichert werden müssen, um verglichen werden zu können - deshalb (und in diesem Fall nicht wegen der beim Vergleich von Zahlen unnötigen / kontraproduktiven Anführungszeichen) funktioniert
If "%DatumJahrtausendszahl%%%4" equ "0" (
auch nicht ...
@Progfreund
Es ist erfreulich, dass Du "Code"-Formatierung benutzt face-smile - noch besser und übersichtlicher wird's mit Einrückungen, etwa:
If "%Datum:~0,1%" equ "0" (  
    set "DatumTageszahl=%Datum:~1,1%"  
) else (
    set "DatumTageszahl=%Datum:~0,2%"  
)
Grüße
bastla
Skyemugen
Skyemugen 24.05.2011 um 07:44:18 Uhr
Goto Top
Aloha bastla,

gut möglich, habe gestern, um ehrlich zu sein, nur schnell draufgeguckt - also nicht im Detail, jetzt wo du es erwähnst, ist mir das auch erst aufgefallen ... vllt. lag's auch einfach an der Codezeilen-ab-Beginn-Flut

*gähn* anyway, schauen wir mal, was sich hier noch so ergibt ich könnt erst einmal wieder schlafen gehen

greetz André
Progfreund
Progfreund 25.05.2011 um 20:56:39 Uhr
Goto Top
Ich habe mir den Code nochmal angeschaut, habe auch schon Verbesserungen hinbekommen.
So habe ich setlocal aktiviert, das Modulo Ergebnis in eine Variable gespeichert, und mit call set gearbeitet.

Nun habe ich mich der doppelten Anführungszeichen angenommen.
Ich habe geschaut, alle Variablen, die Zahlen enthalten, auch durch set /a zu deklarieren.

Es gibt anscheinend einen Syntaxfehler, der meiner Meinung nach auf einen falschen Datentyp hindeutet.
Im Konsolenfenster erscheint bei Monatberechnen die Fehlermeldung "1 kann syntaktisch nicht verarbeitet werden".

Ein großer Fehler muss noch bei der If Abfrage Schaltjahr liegen (logisch oder syntaktisch wegen Klammersetzung)
Dort wird das Ergebnis der If Abfrage immer negativ.

set /p "DatumString=Wie lautet ihr Datum? "  

:DatumFormatieren
set /a "Datum=%DatumString:~0,2%%DatumString:~3,2%%DatumString:~6,2%%DatumString:~8,2%"  
set /a "DatumTageszahlString=%Datum:~0,2%"  
set /a "DatumMonatszahlString=%Datum:~2,2%"  
set /a "DatumJahrhundertszahlString=%Datum:~4,2%"  
set /a "DatumJahreszahlString=%Datum:~6,2%"  

set /a "DatumTageszahl=%DatumTageszahlString%"  
set /a "DatumMonatszahl=%DatumMonatszahlString%"  
set /a "DatumJahrhundertszahl=%DatumJahrhundertszahlString%"  
set /a "DatumJahreszahl=%DatumJahreszahlString%"  

:Monatberechnen
echo Es wird nun die Monatszahl des Datums bestimmt.
If %DatumMonatszahl% equ 1 (
set "MonatsRest=0"  
set "SchaltjahrsMoeglichkeit=1"  
)
If %SchaltjahrsMoeglichkeit% equ 1 (
echo  * Fuer den Monat Januar wurde die
echo  * Schaltjahrsmoeglichkeit auf 1 gesetzt.
goto Jahrberechnen
)
If %DatumMonatszahl% equ 2 (
set "MonatsRest=3"  
set "SchaltjahrsMoeglichkeit=1"  
)
If %SchaltjahrsMoeglichkeit% equ 1 (
echo  * Es lag im Februar bereits eine Schaltjahrsmoeglichkeit
echo  * vor oder wurde angelegt.
goto Jahrberechnen
)
If %DatumMonatszahl% equ 3 set "MonatsRest=3" & goto Jahrberechnen  
If %DatumMonatszahl% equ 4 set "MonatsRest=6" & goto Jahrberechnen  
If %DatumMonatszahl% equ 5 set "MonatsRest=1" & goto Jahrberechnen  
If %DatumMonatszahl% equ 6 set "MonatsRest=4" & goto Jahrberechnen  
If %DatumMonatszahl% equ 7 set "MonatsRest=6" & goto Jahrberechnen  
If %DatumMonatszahl% equ 8 set "MonatsRest=2" & goto Jahrberechnen  
If %DatumMonatszahl% equ 9 set "MonatsRest=5" & goto Jahrberechnen  
If %DatumMonatszahl% equ 10 set "MonatsRest=0" & goto Jahrberechnen  
If %DatumMonatszahl% equ 11 set "MonatsRest=3" & goto Jahrberechnen  
If %DatumMonatszahl% equ 12 set "MonatsRest=5" & goto Jahrberechnen  

:Schaltjahrberechnen
echo Es wird nun geprueft, ob ein Schaltjahr vorliegt.
set /a "SchaltjahrJa=1"  
set /a "SchaltjahrNein=0"  
set /a "DatumJahrtausendSchaltjahr1=%DatumJahrtausendszahl2%%%4"  
echo.
echo DatumJahrtausendSchaltjahr1: "%DatumJahrtausendSchaltjahr1%"  
set /a "DatumJahrtausendSchaltjahr2=%DatumJahrtausendszahl2%%%400"  
echo.
echo DatumJahrtausendSchaltjahr2: "%DatumJahrtausendSchaltjahr2%"  
set /a "DatumJahrtausendSchaltjahr3=%DatumJahrtausendszahl2%%%100"  
echo.
echo DatumJahrtausendSchaltjahr3: "%DatumJahrtausendSchaltjahr3%"  
echo.
If %DatumJahrtausendSchaltjahr1%%%4 equ 0 (
If %DatumJahrtausendSchaltjahr2%%%400 equ 0 (
call set /a "Schaltjahr=%%SchaltjahrJa%%"  
echo Die Jahrtausendszahl ist durch 4, 100 und 400 teilbar.
echo Daher liegt ein Schaltjahr vor.
goto Wochentagberechnen
) else (
If %DatumJahrtausendSchaltjahr3%%%100 equ 0 (
call set /a "Schaltjahr=%%SchaltjahrNein%%"  
echo Die Jahrtausendszahl ist durch 4 und durch 100,
echo aber nicht durch 400 teilbar.
echo Daher liegt kein Schaltjahr vor.
goto Wochentagberechnen
) ) ) else (
call set /a "Schaltjahr=%%SchaltjahrNein%%"  
echo Die Jahrtausendszahl ist nicht durch 4, 100 
echo und 400 teilbar.
echo Daher liegt kein Schaltjahr vor.
goto Wochentagberechnen
)
bastla
bastla 25.05.2011 um 21:12:42 Uhr
Goto Top
Hallo Progfreund!

Da Du die Variable %SchaltjahrsMoeglichkeit% als Schalter verwendest, würde ich darauf verzichten, ihren Wert abzufragen und einfach "if defined" verwenden - dann könnte es auch nicht passieren, dass bei der Abfrage noch kein Wert enthalten ist und daher in der Zeile 21 Nichts mit 1 verglichen werden soll.

Abhilfe würde es ansonsten schaffen, wenn Du der Variablen vorweg einen Wert (konsequenter Weise: 0) zuwiesest ...

Grüße
bastla
Progfreund
Progfreund 25.05.2011 um 21:27:55 Uhr
Goto Top
Danke für den Hinweis. face-smile
Der Code ist an der Stelle geändert. Ich hätte die If equ Abfrage sofort durch If defined ersetzen sollen.
Progfreund
Progfreund 31.05.2011 um 12:36:32 Uhr
Goto Top
Ich habe das Skript nun fertiggeschrieben (s.u.).

Bezüglich des Code Formatierens: muss ich die Einrückung durch Leerzeichen/Tabulator per Hand vornehmen oder gibt es
vielleicht auch Programme im Sinne von Editoren, die das übernehmen können?

Ich habe noch ein paar Fragen zum Code:
for /f %%a in ('echo %DatumString%^|findstr "[^.0-9]"') do ( goto :Anfang )  

  • Warum funktioniert die for Abfrage nicht mit ! Zeichen statt der % Zeichen?

  • Habe ich den Ausschluss der Zeichen . und 0-9 richtig angegeben, oder hätte ich ein Komma setzen müssen?

  • Warum wird der Satz in ( ) Klammern gesetzt und zusätzlich innen mit ' versehen?
  • Ebenso die doppelten Anführungszeichen bei findstr: wo ist der Vorteil dieser Schreibweise und gibt es dafür eine allgemeine Syntaxregel?

  • Kann man die Länge einer Zeichenkette auch anders ermitteln als durch Abspeichern in ein .txt Dokument mit anschließendem Auslesen?

  • Kann man in for Schleifen und If Abfragen goto Anweisungen mit
goto :Sprungmarke
schreiben, oder sollte man den Doppelpunkt weglassen?

  • Wie kann man bei Wiederholung des Programms die Variablen auf undefined setzen? Gibt es ein unsetall?


Ich freue mich über Verbesserungsvorschläge. face-smile



@echo off
setlocal EnableDelayedExpansion
title Wochentag gemaess gregorianischem Kalender bestimmen

:Anfang
cls
echo.
echo Datum im Format (Beispiel) 01.01.0001 bis 31.12.9999
echo.
set /p "DatumString=Wie lautet ihr Datum? "  
echo.
echo Ihr Datum lautet:    "!DatumString!"  
echo.
echo.

:Ueberpruefung
for /f %%a in ('echo %DatumString%^|findstr "[^.0-9]"') do ( goto :Anfang )  

>"!TEMP!\DatumStringLaenge.txt" (echo ^<!DatumString!&echo ^<)  
for /f "delims=:" %%l in ('findstr /o /b "<" "!TEMP!\DatumStringLaenge.txt"') do ( set /a "DatumStringLaenge=%%l-3" )  
del "!TEMP!\DatumStringLaenge.txt"  
echo DatumStringLaenge: "!DatumStringLaenge!"  

If !DatumStringLaenge! gtr 10 goto Anfang

:DatumFormatieren
for /f "tokens=1,2,3 delims=." %%i in ("!DatumString!") do (  
call set /a "DatumTageszahl=%%i"  
call set /a "DatumMonatszahl=%%j"  
call set "DatumJahrtausendszahlString=%%k"  
call set /a "DatumJahrtausendszahl=%%k"  
)
set /a "DatumJahreszahl=!DatumJahrtausendszahlString:~2,2!"  
set /a "DatumJahrhundertszahl=!DatumJahrtausendszahlString:~0,2!"  

echo Um auch Eingaben mit voranstehender Null
echo wie zum Beispiel 01.01.0908 in der
echo Datumseingabe zu verarbeiten, wird
echo das Datum formatiert.
echo.
echo Das Datum wurde wie folgt formatiert:
echo.
echo DatumTageszahl: "!DatumTageszahl!"  
echo DatumMonatszahl: "!DatumMonatszahl!"  
echo DatumJahrhundertszahl: "!DatumJahrhundertszahl!"  
echo DatumJahreszahl: "!DatumJahreszahl!"  
echo DatumJahrtausendszahl: "!DatumJahrtausendszahl!"  

:Tagberechnen
echo Es wird nun die Tageszahl des Datums umgerechnet.
set /a "TagesRest=!DatumTageszahl!%%7"  
echo Die TagesRest Zahl betraegt: "!TagesRest!"  
echo.

:Monatberechnen
echo Es wird nun die Monatszahl des Datums bestimmt.

If !DatumMonatszahl! equ 12 set "MonatsRest=5" & echo Die MonatsRest Zahl betraegt: "!MonatsRest!" & goto Jahrberechnen  
If !DatumMonatszahl! equ 11 set "MonatsRest=3" & echo Die MonatsRest Zahl betraegt: "!MonatsRest!" & goto Jahrberechnen  
If !DatumMonatszahl! equ 10 set "MonatsRest=0" & echo Die MonatsRest Zahl betraegt: "!MonatsRest!" & goto Jahrberechnen  
If !DatumMonatszahl! equ 9 set "MonatsRest=5" & echo Die MonatsRest Zahl betraegt: "!MonatsRest!" & goto Jahrberechnen  
If !DatumMonatszahl! equ 8 set "MonatsRest=2" & echo Die MonatsRest Zahl betraegt: "!MonatsRest!" & goto Jahrberechnen  
If !DatumMonatszahl! equ 7 set "MonatsRest=6" & echo Die MonatsRest Zahl betraegt: "!MonatsRest!" & goto Jahrberechnen  
If !DatumMonatszahl! equ 6 set "MonatsRest=4" & echo Die MonatsRest Zahl betraegt: "!MonatsRest!" & goto Jahrberechnen  
If !DatumMonatszahl! equ 5 set "MonatsRest=1" & echo Die MonatsRest Zahl betraegt: "!MonatsRest!" & goto Jahrberechnen  
If !DatumMonatszahl! equ 4 set "MonatsRest=6" & echo Die MonatsRest Zahl betraegt: "!MonatsRest!" & goto Jahrberechnen  
If !DatumMonatszahl! equ 3 set "MonatsRest=3" & echo Die MonatsRest Zahl betraegt: "!MonatsRest!" & goto Jahrberechnen  

If !DatumMonatszahl! equ 2 (
call set /a "MonatsRest=3"  
call set /a "SchaltjahrsMoeglichkeit=1"  
echo Die MonatsRest Zahl betraegt: "!MonatsRest!"  
echo  * Fuer den Monat Februar wurde die
echo  * Schaltjahrsmoeglichkeit auf 1 gesetzt.
goto Jahrberechnen
)

If !DatumMonatszahl! equ 1 (
call set /a "MonatsRest=0"  
call set /a "SchaltjahrsMoeglichkeit=1"  
echo Die MonatsRest Zahl betraegt: "!MonatsRest!"  
echo  * Fuer den Monat Januar wurde die
echo  * Schaltjahrsmoeglichkeit auf 1 gesetzt.
goto Jahrberechnen
)

:Jahrberechnen
echo.
echo Es wird nun die Jahreszahl des Datums umgerechnet.
set /a "JahresRest=!DatumJahreszahl!/4"  
set /a "JahresRest2=!DatumJahreszahl!+!JahresRest!"  
set /a "JahresRest2=!JahresRest2!%%7"  
echo Die JahresRest Zahl betraegt: "!JahresRest2!"  
echo.

:Jahrhundertberechnen
echo Es wird nun die Jahrhundertszahl des Datums umgerechnet.
set /a "JahrhundertsRest=!DatumJahrhundertszahl!%%4"  
set /a "JahrhundertsRest2=3-!JahrhundertsRest!"  
set /a "JahrhundertsRest2=!JahrhundertsRest2!*2"  
echo Die JahrhundertsRest Zahl betraegt: "!JahrhundertsRest2!"  
echo.

:Schaltjahrberechnen
echo Es wird nun geprueft, ob ein Schaltjahr vorliegt.
set /a "SchaltjahrJa=1"  
set /a "DatumJahrtausendSchaltjahr1=!DatumJahrtausendszahl!%%4"  
set /a "DatumJahrtausendSchaltjahr2=!DatumJahrtausendszahl!%%100"  
set /a "DatumJahrtausendSchaltjahr3=!DatumJahrtausendszahl!%%400"  
echo DatumJahrtausendSchaltjahr1: "!DatumJahrtausendSchaltjahr1!"  
echo DatumJahrtausendSchaltjahr2: "!DatumJahrtausendSchaltjahr2!"  
echo DatumJahrtausendSchaltjahr3: "!DatumJahrtausendSchaltjahr3!"  
echo.

If not !DatumJahrtausendSchaltjahr1! equ 0 (
echo Die Jahrtausendszahl ist nicht teilbar durch 4.
echo Daher liegt kein Schaltjahr vor.
) else (
If !DatumJahrtausendSchaltjahr3! equ 0 (
call set /a "Schaltjahr=!SchaltjahrJa!"  
echo Die Jahrtausendszahl ist teilbar durch 4, 100, 400.
echo Daher liegt ein Schaltjahr vor.
) else (
If !DatumJahrtausendSchaltjahr2! equ 0 (
echo Die Jahrtausendszahl ist teilbar durch 4, 100, aber nicht durch 400.
echo Daher liegt kein Schaltjahr vor.
) ) )

If defined SchaltjahrsMoeglichkeit (
If defined Schaltjahr (
call set "Additionszeichen=+"  
call set /a "Schaltjahrsparameter=6"  
echo Schaltjahr aufgrund Monats fuer Berechnung bedeutsam.
) else (
echo Schaltjahr aufgrund Monats fuer Berechnung nicht bedeutsam.
) )

:Wochentagberechnen
set /a "WochentagsRest=!TagesRest!+!MonatsRest!+!JahresRest2!+!JahrhundertsRest2!!Additionszeichen!!Schaltjahrsparameter!"  
set /a "WochentagsRest2=!WochentagsRest!%%7"  
If !WochentagsRest2! equ 0 set "Wochentag=Sonntag"  
If !WochentagsRest2! equ 1 set "Wochentag=Montag"  
If !WochentagsRest2! equ 2 set "Wochentag=Dienstag"  
If !WochentagsRest2! equ 3 set "Wochentag=Mittwoch"  
If !WochentagsRest2! equ 4 set "Wochentag=Donnerstag"  
If !WochentagsRest2! equ 5 set "Wochentag=Freitag"  
If !WochentagsRest2! equ 6 set "Wochentag=Samstag"  

:End
echo.
echo.
echo Uebersicht:
echo.
echo Eingegebenes Datum:  "!DatumString!"  
echo Formatiertes Datum:  "!DatumTageszahl!.!DatumMonatszahl!.!DatumJahrhundertszahl!!DatumJahreszahl!"  
echo Reste von
echo     Tag:             "!TagesRest!"  
echo     Monat:           "!MonatsRest!"  
echo     Jahrhundert:     "!JahrhundertsRest2!"  
echo     Jahr:            "!JahresRest2!"  
echo.
echo Schaltjahr:          "!Schaltjahr!"  
echo Schaltjahrsrelevanz: "!SchaltjahrsMoeglichkeit!"  
echo Schaltjahrparameter: "!Schaltjahrsparameter!"  
echo Auflistung aller
echo Summanden:           "!TagesRest!+!MonatsRest!+!JahrhundertsRest2!+!JahresRest2!!Additionszeichen!!Schaltjahrsparameter!"  
echo Summe der Reste:     "!WochentagsRest!"  
echo Rest der Reste:      "!WochentagsRest2!"  
echo Wochentag:           "!Wochentag!"  
echo.
echo.
echo.
echo Moechten Sie das Programm nochmal von vorne durchlaufen?
set /p "Wiederholung=Ja: [1] oder Nein: [2] ? "  
If !Wiederholung! equ 1 goto Anfang
If !Wiederholung! equ 2 (
echo.
echo Das Programm ist an seinem Ende.
echo.
)
endlocal
pause
exit
bastla
bastla 01.06.2011 um 17:11:36 Uhr
Goto Top
Hallo Progfreund!

Ich werde versuchen, zumindest einige der Fragen zu beantworten - zunächst gleich mal als Alternative zu
for /f %%a in ('echo %DatumString%^|findstr "[^.0-9]"') do ( goto :Anfang )
die Variante
echo %DatumString%^|findstr "[^.0-9]">nul && goto :Anfang
- auch hier wird Ausschluss der Zeichen "." und "0-9" auf die gleiche (funktionierende) Weise durchgeführt.
Kann man die Länge einer Zeichenkette auch anders ermitteln als durch Abspeichern in ein .txt Dokument mit anschließendem Auslesen?
Eine Möglichkeit wäre zB
@echo off & setlocal
set "String=1234567890123"  

set "StringTemp=%String%"  
set /a L=0
:Loop
if "%StringTemp%"=="" goto :Done  
set "StringTemp=%StringTemp:~1%"  
set /a L+=1
goto :Loop

:Done
echo Laenge=%L%
... sollte man den Doppelpunkt weglassen?
Ich kenne generell keinen Nachteil der Schreibweise
goto :Sprungmarke
- und da der Doppelpunkt bei einem "call" erforderlich ist, habe ich ihn mir auch für "goto" angewöhnt.

Grüße
bastla