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:
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.
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
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/contentid/166749
Ausgedruckt am: 22.11.2024 um 04:11 Uhr
10 Kommentare
Neuester Kommentar
Aloha,
ich antworte hier mal auf deine PM, da ich es unschön finde, Probleme intern zu lösen für öffentliche Anfragen.
In Batch eine Variable als Zahl formatieren, nun ich denke, du beziehst dich auf meine Anmerkung zu deinem
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é
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
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é
@Skyemugen
Ich beschränke mich auch auf den Vorschlag, "
auch nicht ...
@Progfreund
Es ist erfreulich, dass Du "Code"-Formatierung benutzt - noch besser und übersichtlicher wird's mit Einrückungen, etwa:
Grüße
bastla
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) funktioniertIf "%DatumJahrtausendszahl%%%4" equ "0" (
@Progfreund
Es ist erfreulich, dass Du "Code"-Formatierung benutzt - 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%"
)
bastla
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é
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é
Hallo Progfreund!
Da Du die Variable %SchaltjahrsMoeglichkeit% als Schalter verwendest, würde ich darauf verzichten, ihren Wert abzufragen und einfach "
Abhilfe würde es ansonsten schaffen, wenn Du der Variablen vorweg einen Wert (konsequenter Weise: 0) zuwiesest ...
Grüße
bastla
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
Hallo Progfreund!
Ich werde versuchen, zumindest einige der Fragen zu beantworten - zunächst gleich mal als Alternative zu
die Variante
- auch hier wird Ausschluss der Zeichen "." und "0-9" auf die gleiche (funktionierende) Weise durchgeführt.
- und da der Doppelpunkt bei einem "
Grüße
bastla
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 )
echo %DatumString%^|findstr "[^.0-9]">nul && goto :Anfang
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 Schreibweisegoto :Sprungmarke
call
" erforderlich ist, habe ich ihn mir auch für "goto
" angewöhnt.Grüße
bastla