Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
Kommentar vom Moderator Biber am 25.05.2011 um 21:47:02 Uhr
Verschoben von "Entwicklung" nach "Batch & Shell".

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

Frage Entwicklung Batch & Shell

Mitglied: Progfreund

Progfreund (Level 1) - Jetzt verbinden

23.05.2011, aktualisiert 25.05.2011, 3924 Aufrufe, 10 Kommentare

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 unverständlicher if-Abfrage-Fehler und Doppelte If-Abfrage funktioniert nicht
angeschaut, aber ich denke, hier ist noch ein anderer Fehler.

Bitte um Vorschläge.

Skript:
01.
@echo off 
02.
title Wochentag bestimmen 
03.
 
04.
:Anfang 
05.
echo. 
06.
echo  =============================================================== 
07.
echo ^|                                                               ^| 
08.
echo ^| Dieses Programm gibt gemaess dem gregorianischen Kalender     ^| 
09.
echo ^| die Wochentage entsprechend dem Datum an.                     ^| 
10.
echo ^|                                                               ^| 
11.
echo ^| Geben Sie ein Datum nach folgendem Beispiel ein:              ^| 
12.
echo ^| TagTag.MonatMonat.JahrJahrJahrJahr (TT.MM.JJJJ)               ^| 
13.
echo ^| wie 21.01.1990                                                ^| 
14.
echo ^|                                                               ^| 
15.
echo  =============================================================== 
16.
echo. 
17.
echo. 
18.
set /p "Datum=Wie lautet ihr Datum? " 
19.
echo. 
20.
echo Ihr Datum lautet: "%Datum%" 
21.
echo. 
22.
echo. 
23.
echo. 
24.
echo Wiedergabe der eingegebenen Zeichen (max. 10): 
25.
echo. 
26.
echo Zeichen  1: "%Datum:~0,1%"   Zeichen  6: "%Datum:~5,1%" 
27.
echo Zeichen  2: "%Datum:~1,1%"   Zeichen  7: "%Datum:~6,1%" 
28.
echo Zeichen  3: "%Datum:~2,1%"   Zeichen  8: "%Datum:~7,1%" 
29.
echo Zeichen  4: "%Datum:~3,1%"   Zeichen  9: "%Datum:~8,1%" 
30.
echo Zeichen  5: "%Datum:~4,1%"   Zeichen 10: "%Datum:~9,1%" 
31.
echo. 
32.
echo. 
33.
echo. 
34.
 
35.
:DatumFormatieren 
36.
If "%Datum:~0,1%" equ "0" ( 
37.
set "DatumTageszahl=%Datum:~1,1%" 
38.
) else ( 
39.
set "DatumTageszahl=%Datum:~0,2%" 
40.
41.
If "%Datum:~3,1%" equ "0" ( 
42.
set "DatumMonatszahl=%Datum:~4,1%" 
43.
) else ( 
44.
set "DatumMonatszahl=%Datum:~3,2%" 
45.
46.
If "%Datum:~6,1%" equ "0" ( 
47.
set "DatumJahrhundertszahl=%Datum:~7,1%" 
48.
) else ( 
49.
set "DatumJahrhundertszahl=%Datum:~6,2%" 
50.
51.
If "%Datum:~8,1%" equ "0" ( 
52.
set "DatumJahreszahl=%Datum:~9,1%" 
53.
) else ( 
54.
set "DatumJahreszahl=%Datum:~8,2%" 
55.
56.
echo Um auch Eingaben mit voranstehender Null 
57.
echo wie zum Beispiel 01.01.0908 in der 
58.
echo Datumseingabe zu verarbeiten, wird 
59.
echo das Datum formatiert. 
60.
echo. 
61.
echo Das Datum wurde wie folgt formatiert: 
62.
echo. 
63.
set "DatumJahrtausendszahl=%DatumJahrhundertszahl%%DatumJahreszahl%" 
64.
echo Die DatumTageszahl "%DatumTageszahl%" 
65.
echo Die DatumMonatszahl "%DatumMonatszahl%" 
66.
echo Die DatumJahrhundertszahl "%DatumJahrhundertszahl%" 
67.
echo Die DatumJahreszahl "%DatumJahreszahl%" 
68.
echo Die DatumJahrtausendszahl "%DatumJahrtausendszahl%" 
69.
echo. 
70.
echo. 
71.
echo. 
72.
 
73.
:Ueberpruefung 
74.
echo Es werden nun die Eingaben ueberprueft: 
75.
echo Es sollten vier korrekte Meldungen erscheinen, 
76.
echo je eine fuer die Tageszahl, die Monatszahl, die 
77.
echo Jahrhundertszahl und die Jahreszahl. 
78.
echo. 
79.
If "%DatumTageszahl%" leq "31" ( 
80.
If "%DatumTageszahl%" geq "1" ( 
81.
echo Die Tageszahl wurde korrekt eingegeben. 
82.
83.
) else ( 
84.
echo Die Tageszahl wurde nicht korrekt eingegeben. 
85.
86.
If "%DatumMonatszahl%" leq "12" ( 
87.
If "%DatumMonatszahl%" geq "1" ( 
88.
echo Die Monatszahl wurde korrekt eingegeben. 
89.
90.
) else ( 
91.
echo Die Monatszahl wurde nicht korrekt eingegeben. 
92.
93.
If "%DatumJahrhundertszahl%" leq "99" ( 
94.
If "%DatumJahrhundertszahl%" geq "1" ( 
95.
echo Die Jahrhundertszahl wurde korrekt eingegeben. 
96.
97.
) else ( 
98.
echo Die Jahrhundertszahl wurde nicht korrekt eingegeben. 
99.
100.
If "%DatumJahreszahl%" leq "99" ( 
101.
If "%DatumJahreszahl%" geq "1" ( 
102.
echo Die Jahreszahl wurde korrekt eingegeben. 
103.
104.
) else ( 
105.
echo Die Jahreszahl wurde nicht korrekt eingegeben. 
106.
107.
echo. 
108.
echo. 
109.
echo. 
110.
echo Fuer die Berechnung des Wochentages ist es notwendig, 
111.
echo das eingegebene Datum zu verrechnen. 
112.
echo Es werden nun nacheinander die einzelnen Werte fuer 
113.
echo die Tageszahl, die Monatszahl, die Jahrhundertszahl und 
114.
echo die Jahreszahl berechnet bzw. bestimmt. 
115.
echo. 
116.
echo. 
117.
 
118.
:Tagberechnen 
119.
echo Es wird nun die Tageszahl des Datums umgerechnet. 
120.
set /a "TagesRest=%DatumTageszahl%%%7" 
121.
echo Die TagesRest Zahl betraegt: "%TagesRest%" 
122.
echo. 
123.
 
124.
:Monatberechnen 
125.
echo Es wird nun die Monatszahl des Datums bestimmt. 
126.
If "%DatumMonatszahl%" equ "1" ( 
127.
set "MonatsRest=0" 
128.
set "SchaltjahrsMoeglichkeit=1" 
129.
130.
If "%SchaltjahrsMoeglichkeit%" equ "1" ( 
131.
echo  * Fuer den Monat Januar wurde die 
132.
echo  * Schaltjahrsmoeglichkeit auf 1 gesetzt. 
133.
134.
If "%DatumMonatszahl%" equ "2" ( 
135.
set "MonatsRest=3" 
136.
set "SchaltjahrsMoeglichkeit=1" 
137.
138.
If "%SchaltjahrsMoeglichkeit%" equ "1" ( 
139.
echo  * Es lag im Februar bereits eine Schaltjahrsmoeglichkeit 
140.
echo  * vor oder wurde angelegt. 
141.
142.
If "%DatumMonatszahl%" equ "3" set "MonatsRest=3" 
143.
If "%DatumMonatszahl%" equ "4" set "MonatsRest=6" 
144.
If "%DatumMonatszahl%" equ "5" set "MonatsRest=1" 
145.
If "%DatumMonatszahl%" equ "6" set "MonatsRest=4" 
146.
If "%DatumMonatszahl%" equ "7" set "MonatsRest=6" 
147.
If "%DatumMonatszahl%" equ "8" set "MonatsRest=2" 
148.
If "%DatumMonatszahl%" equ "9" set "MonatsRest=5" 
149.
If "%DatumMonatszahl%" equ "10" set "MonatsRest=0" 
150.
If "%DatumMonatszahl%" equ "11" set "MonatsRest=3" 
151.
If "%DatumMonatszahl%" equ "12" set "MonatsRest=5" 
152.
echo Die MonatsRest Zahl betraegt: "%MonatsRest%" 
153.
echo. 
154.
 
155.
:Jahrberechnen 
156.
echo Es wird nun die Jahreszahl des Datums umgerechnet. 
157.
set /a "JahresRest=%DatumJahreszahl%/4" 
158.
set /a "JahresRest2=%DatumJahreszahl%+%JahresRest%" 
159.
set /a "JahresRest2=%JahresRest2%%%7" 
160.
echo Die JahresRest Zahl betraegt: "%JahresRest2%" 
161.
echo. 
162.
 
163.
:Jahrhundertberechnen 
164.
echo Es wird nun die Jahrhundertszahl des Datums umgerechnet. 
165.
set /a "JahrhundertsRest=%DatumJahrhundertszahl%%%4" 
166.
set /a "JahrhundertsRest2=3-%JahrhundertsRest%" 
167.
set /a "JahrhundertsRest2=%JahrhundertsRest2%*2" 
168.
echo Die JahrhundertsRest Zahl betraegt: "%JahrhundertsRest2%" 
169.
echo. 
170.
 
171.
:Schaltjahrberechnen 
172.
echo Es wird nun geprueft, ob ein Schaltjahr vorliegt. 
173.
If "%DatumJahrtausendszahl%%%4" equ "0" ( 
174.
If "%DatumJahrtausendszahl%%%100" equ "0" ( 
175.
If "%DatumJahrtausendszahl%%%400" equ "0" ( 
176.
set "Schaltjahr=1" 
177.
echo Die Jahrtausendszahl ist durch 4, 100 und 400 teilbar. 
178.
echo Daher liegt ein Schaltjahr vor. 
179.
goto Wochentagberechnen 
180.
181.
) else ( 
182.
set "Schaltjahr=0" 
183.
echo Die Jahrtausendszahl ist durch 4 und durch 100, aber nicht 
184.
echo durch 400 teilbar. Daher liegt kein Schaltjahr vor. 
185.
goto Wochentagberechnen 
186.
187.
set "Schaltjahr=1" 
188.
echo Die Jahrtausendszahl ist durch 4 teilbar, aber nicht durch 100 
189.
echo und nicht durch 400. Daher liegt ein Schaltjahr vor. 
190.
goto Wochentagberechnen 
191.
) else ( 
192.
set "Schaltjahr=0" 
193.
echo Die Jahrtausendszahl ist nicht durch 4 teilbar. 
194.
echo Daher liegt kein Schaltjahr vor. 
195.
goto Wochentagberechnen 
196.
197.
 
198.
:Wochentagberechnen 
199.
echo. 
200.
echo. 
201.
echo. 
202.
echo ----------------------------------------------------------------- 
203.
echo. 
204.
echo Es wird nun der Wochentag berechnet durch Addition der 
205.
echo einzelnen Summanden und anschliessender Modulo 
206.
echo Division durch 7. 
207.
echo. 
208.
If not defined SchaltjahrsMoeglichkeit ( 
209.
set "SchaltjahrsMoeglichkeitsStatus=undefined" 
210.
) else ( 
211.
set "SchaltjahrsMoeglichkeitsStatus=defined "%SchaltjahrsMoeglichkeit%"" 
212.
213.
echo Die Schaltjahrsmoeglichkeit liegt bei "%SchaltjahrsMoeglichkeitsStatus%" 
214.
If "%Schaltjahr%" equ "1" ( 
215.
If "%SchaltjahrsMoeglichkeit%" equ "1" ( 
216.
set "Schaltjahrparameter=6" 
217.
echo Schaltjahr aufgrund Monats fuer Berechnung bedeutsam. 
218.
219.
) else ( 
220.
set "Schaltjahrparameter=0" 
221.
echo Schaltjahr Parameter fuer Berechnung nicht bedeutsam. 
222.
223.
echo. 
224.
echo Ermittlung des Wochentags Rests:  
225.
echo. 
226.
echo %%TagesRest%% 
227.
echo      + 
228.
echo %%MonatsRest%% 
229.
echo      + 
230.
echo %%JahresRest%% 
231.
echo      + 
232.
echo %%JahrhundertsRest%% 
233.
echo      + 
234.
echo %%Schaltjahrparameter%% 
235.
echo. 
236.
echo also: 
237.
echo. 
238.
echo %TagesRest%+%MonatsRest%+%JahresRest2%+%JahrhundertsRest2%+%Schaltjahrparameter% 
239.
echo. 
240.
set /a "WochentagsRest=%TagesRest%+%MonatsRest%+%JahresRest2%+%JahrhundertsRest2%+%Schaltjahrparameter%" 
241.
set /a "WochentagsRest=%WochentagsRest%%%7" 
242.
echo Die Summe der einzelnen Rest Werte nach der 
243.
echo Modulo Division ergibt "%WochentagsRest%" 
244.
echo. 
245.
If "%WochentagsRest%" equ "0" set "Wochentag=Sonntag" 
246.
If "%WochentagsRest%" equ "1" set "Wochentag=Montag" 
247.
If "%WochentagsRest%" equ "2" set "Wochentag=Dienstag" 
248.
If "%WochentagsRest%" equ "3" set "Wochentag=Mittwoch" 
249.
If "%WochentagsRest%" equ "4" set "Wochentag=Donnerstag" 
250.
If "%WochentagsRest%" equ "5" set "Wochentag=Freitag" 
251.
If "%WochentagsRest%" equ "6" set "Wochentag=Samstag" 
252.
echo Gemaess dem gregorianischen Kalender 
253.
echo ist dem Datum "%Datum%" 
254.
echo der Wochentag "%Wochentag%" 
255.
echo zugeordnet. 
256.
echo. 
257.
 
258.
:End 
259.
set "Datum=" 
260.
set "DatumTageszahl=" 
261.
set "DatumMonatszahl=" 
262.
set "DatumJahrhundertszahl=" 
263.
set "DatumJahreszahl=" 
264.
set "DatumJahrtausendszahl=" 
265.
set "TagesRest=" 
266.
set "SchaltjahrsMoeglichkeit=" 
267.
set "MonatsRest=" 
268.
set "JahresRest=" 
269.
set "JahresRest2=" 
270.
set "JahrhundertsRest=" 
271.
set "JahrhundertsRest2=" 
272.
set "Schaltjahr=" 
273.
set "SchaltjahrsMoeglichkeitsStatus=" 
274.
set "Schaltjahrparameter=" 
275.
set "WochentagsRest=" 
276.
set "Wochentag=" 
277.
set "Wiederholung=" 
278.
echo. 
279.
echo Moechten Sie das Programm nochmal von vorne durchlaufen? 
280.
set /p "Wiederholung=Ja: [1] oder Nein: [2] ? " 
281.
If "%Wiederholung%" equ "1" goto Anfang 
282.
If "%Wiederholung%" equ "2" ( 
283.
echo. 
284.
echo Das Programm ist an seinem Ende. 
285.
echo. 
286.
287.
pause 
288.
exit
Mitglied: Skyemugen
23.05.2011 um 15:50 Uhr
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é
Bitte warten ..
Mitglied: Progfreund
23.05.2011 um 17:54 Uhr
@Skyemugen
habe in Zeile 208
If not defined "%SchaltjahrsMoeglichkeit%" (
durch
If not defined SchaltjahrsMoeglichkeit (
ersetzt.

Danke André
Bitte warten ..
Mitglied: Skyemugen
23.05.2011 um 20:30 Uhr
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é
Bitte warten ..
Mitglied: bastla
23.05.2011 um 23:03 Uhr
@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 - noch besser und übersichtlicher wird's mit Einrückungen, etwa:
01.
If "%Datum:~0,1%" equ "0" ( 
02.
    set "DatumTageszahl=%Datum:~1,1%" 
03.
) else ( 
04.
    set "DatumTageszahl=%Datum:~0,2%" 
05.
)
Grüße
bastla
Bitte warten ..
Mitglied: Skyemugen
24.05.2011 um 07:44 Uhr
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é
Bitte warten ..
Mitglied: Progfreund
25.05.2011 um 20:56 Uhr
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.

01.
set /p "DatumString=Wie lautet ihr Datum? " 
02.
 
03.
:DatumFormatieren 
04.
set /a "Datum=%DatumString:~0,2%%DatumString:~3,2%%DatumString:~6,2%%DatumString:~8,2%" 
05.
set /a "DatumTageszahlString=%Datum:~0,2%" 
06.
set /a "DatumMonatszahlString=%Datum:~2,2%" 
07.
set /a "DatumJahrhundertszahlString=%Datum:~4,2%" 
08.
set /a "DatumJahreszahlString=%Datum:~6,2%" 
09.
 
10.
set /a "DatumTageszahl=%DatumTageszahlString%" 
11.
set /a "DatumMonatszahl=%DatumMonatszahlString%" 
12.
set /a "DatumJahrhundertszahl=%DatumJahrhundertszahlString%" 
13.
set /a "DatumJahreszahl=%DatumJahreszahlString%" 
14.
 
15.
:Monatberechnen 
16.
echo Es wird nun die Monatszahl des Datums bestimmt. 
17.
If %DatumMonatszahl% equ 1 ( 
18.
set "MonatsRest=0" 
19.
set "SchaltjahrsMoeglichkeit=1" 
20.
21.
If %SchaltjahrsMoeglichkeit% equ 1 ( 
22.
echo  * Fuer den Monat Januar wurde die 
23.
echo  * Schaltjahrsmoeglichkeit auf 1 gesetzt. 
24.
goto Jahrberechnen 
25.
26.
If %DatumMonatszahl% equ 2 ( 
27.
set "MonatsRest=3" 
28.
set "SchaltjahrsMoeglichkeit=1" 
29.
30.
If %SchaltjahrsMoeglichkeit% equ 1 ( 
31.
echo  * Es lag im Februar bereits eine Schaltjahrsmoeglichkeit 
32.
echo  * vor oder wurde angelegt. 
33.
goto Jahrberechnen 
34.
35.
If %DatumMonatszahl% equ 3 set "MonatsRest=3" & goto Jahrberechnen 
36.
If %DatumMonatszahl% equ 4 set "MonatsRest=6" & goto Jahrberechnen 
37.
If %DatumMonatszahl% equ 5 set "MonatsRest=1" & goto Jahrberechnen 
38.
If %DatumMonatszahl% equ 6 set "MonatsRest=4" & goto Jahrberechnen 
39.
If %DatumMonatszahl% equ 7 set "MonatsRest=6" & goto Jahrberechnen 
40.
If %DatumMonatszahl% equ 8 set "MonatsRest=2" & goto Jahrberechnen 
41.
If %DatumMonatszahl% equ 9 set "MonatsRest=5" & goto Jahrberechnen 
42.
If %DatumMonatszahl% equ 10 set "MonatsRest=0" & goto Jahrberechnen 
43.
If %DatumMonatszahl% equ 11 set "MonatsRest=3" & goto Jahrberechnen 
44.
If %DatumMonatszahl% equ 12 set "MonatsRest=5" & goto Jahrberechnen
01.
:Schaltjahrberechnen 
02.
echo Es wird nun geprueft, ob ein Schaltjahr vorliegt. 
03.
set /a "SchaltjahrJa=1" 
04.
set /a "SchaltjahrNein=0" 
05.
set /a "DatumJahrtausendSchaltjahr1=%DatumJahrtausendszahl2%%%4" 
06.
echo. 
07.
echo DatumJahrtausendSchaltjahr1: "%DatumJahrtausendSchaltjahr1%" 
08.
set /a "DatumJahrtausendSchaltjahr2=%DatumJahrtausendszahl2%%%400" 
09.
echo. 
10.
echo DatumJahrtausendSchaltjahr2: "%DatumJahrtausendSchaltjahr2%" 
11.
set /a "DatumJahrtausendSchaltjahr3=%DatumJahrtausendszahl2%%%100" 
12.
echo. 
13.
echo DatumJahrtausendSchaltjahr3: "%DatumJahrtausendSchaltjahr3%" 
14.
echo. 
15.
If %DatumJahrtausendSchaltjahr1%%%4 equ 0 ( 
16.
If %DatumJahrtausendSchaltjahr2%%%400 equ 0 ( 
17.
call set /a "Schaltjahr=%%SchaltjahrJa%%" 
18.
echo Die Jahrtausendszahl ist durch 4, 100 und 400 teilbar. 
19.
echo Daher liegt ein Schaltjahr vor. 
20.
goto Wochentagberechnen 
21.
) else ( 
22.
If %DatumJahrtausendSchaltjahr3%%%100 equ 0 ( 
23.
call set /a "Schaltjahr=%%SchaltjahrNein%%" 
24.
echo Die Jahrtausendszahl ist durch 4 und durch 100, 
25.
echo aber nicht durch 400 teilbar. 
26.
echo Daher liegt kein Schaltjahr vor. 
27.
goto Wochentagberechnen 
28.
) ) ) else ( 
29.
call set /a "Schaltjahr=%%SchaltjahrNein%%" 
30.
echo Die Jahrtausendszahl ist nicht durch 4, 100  
31.
echo und 400 teilbar. 
32.
echo Daher liegt kein Schaltjahr vor. 
33.
goto Wochentagberechnen 
34.
)
Bitte warten ..
Mitglied: bastla
25.05.2011 um 21:12 Uhr
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
Bitte warten ..
Mitglied: Progfreund
25.05.2011 um 21:27 Uhr
Danke für den Hinweis.
Der Code ist an der Stelle geändert. Ich hätte die If equ Abfrage sofort durch If defined ersetzen sollen.
Bitte warten ..
Mitglied: Progfreund
31.05.2011 um 12:36 Uhr
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:
01.
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
01.
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.



01.
@echo off 
02.
setlocal EnableDelayedExpansion 
03.
title Wochentag gemaess gregorianischem Kalender bestimmen 
04.
 
05.
:Anfang 
06.
cls 
07.
echo
08.
echo Datum im Format (Beispiel) 01.01.0001 bis 31.12.9999 
09.
echo
10.
set /p "DatumString=Wie lautet ihr Datum? " 
11.
echo
12.
echo Ihr Datum lautet:    "!DatumString!" 
13.
echo
14.
echo
15.
 
16.
:Ueberpruefung 
17.
for /f %%a in ('echo %DatumString%^|findstr "[^.0-9]"') do ( goto :Anfang ) 
18.
 
19.
>"!TEMP!\DatumStringLaenge.txt" (echo ^<!DatumString!&echo ^<) 
20.
for /f "delims=:" %%l in ('findstr /o /b "<" "!TEMP!\DatumStringLaenge.txt"') do ( set /a "DatumStringLaenge=%%l-3"
21.
del "!TEMP!\DatumStringLaenge.txt" 
22.
echo DatumStringLaenge: "!DatumStringLaenge!" 
23.
 
24.
If !DatumStringLaenge! gtr 10 goto Anfang 
25.
 
26.
:DatumFormatieren 
27.
for /f "tokens=1,2,3 delims=." %%i in ("!DatumString!") do
28.
call set /a "DatumTageszahl=%%i" 
29.
call set /a "DatumMonatszahl=%%j" 
30.
call set "DatumJahrtausendszahlString=%%k" 
31.
call set /a "DatumJahrtausendszahl=%%k" 
32.
33.
set /a "DatumJahreszahl=!DatumJahrtausendszahlString:~2,2!" 
34.
set /a "DatumJahrhundertszahl=!DatumJahrtausendszahlString:~0,2!" 
35.
 
36.
echo Um auch Eingaben mit voranstehender Null 
37.
echo wie zum Beispiel 01.01.0908 in der 
38.
echo Datumseingabe zu verarbeiten, wird 
39.
echo das Datum formatiert. 
40.
echo
41.
echo Das Datum wurde wie folgt formatiert: 
42.
echo
43.
echo DatumTageszahl: "!DatumTageszahl!" 
44.
echo DatumMonatszahl: "!DatumMonatszahl!" 
45.
echo DatumJahrhundertszahl: "!DatumJahrhundertszahl!" 
46.
echo DatumJahreszahl: "!DatumJahreszahl!" 
47.
echo DatumJahrtausendszahl: "!DatumJahrtausendszahl!" 
48.
 
49.
:Tagberechnen 
50.
echo Es wird nun die Tageszahl des Datums umgerechnet. 
51.
set /a "TagesRest=!DatumTageszahl!%%7" 
52.
echo Die TagesRest Zahl betraegt: "!TagesRest!" 
53.
echo
54.
 
55.
:Monatberechnen 
56.
echo Es wird nun die Monatszahl des Datums bestimmt. 
57.
 
58.
If !DatumMonatszahl! equ 12 set "MonatsRest=5" & echo Die MonatsRest Zahl betraegt: "!MonatsRest!" & goto Jahrberechnen 
59.
If !DatumMonatszahl! equ 11 set "MonatsRest=3" & echo Die MonatsRest Zahl betraegt: "!MonatsRest!" & goto Jahrberechnen 
60.
If !DatumMonatszahl! equ 10 set "MonatsRest=0" & echo Die MonatsRest Zahl betraegt: "!MonatsRest!" & goto Jahrberechnen 
61.
If !DatumMonatszahl! equ 9 set "MonatsRest=5" & echo Die MonatsRest Zahl betraegt: "!MonatsRest!" & goto Jahrberechnen 
62.
If !DatumMonatszahl! equ 8 set "MonatsRest=2" & echo Die MonatsRest Zahl betraegt: "!MonatsRest!" & goto Jahrberechnen 
63.
If !DatumMonatszahl! equ 7 set "MonatsRest=6" & echo Die MonatsRest Zahl betraegt: "!MonatsRest!" & goto Jahrberechnen 
64.
If !DatumMonatszahl! equ 6 set "MonatsRest=4" & echo Die MonatsRest Zahl betraegt: "!MonatsRest!" & goto Jahrberechnen 
65.
If !DatumMonatszahl! equ 5 set "MonatsRest=1" & echo Die MonatsRest Zahl betraegt: "!MonatsRest!" & goto Jahrberechnen 
66.
If !DatumMonatszahl! equ 4 set "MonatsRest=6" & echo Die MonatsRest Zahl betraegt: "!MonatsRest!" & goto Jahrberechnen 
67.
If !DatumMonatszahl! equ 3 set "MonatsRest=3" & echo Die MonatsRest Zahl betraegt: "!MonatsRest!" & goto Jahrberechnen 
68.
 
69.
If !DatumMonatszahl! equ 2 ( 
70.
call set /a "MonatsRest=3" 
71.
call set /a "SchaltjahrsMoeglichkeit=1" 
72.
echo Die MonatsRest Zahl betraegt: "!MonatsRest!" 
73.
echo  * Fuer den Monat Februar wurde die 
74.
echo  * Schaltjahrsmoeglichkeit auf 1 gesetzt. 
75.
goto Jahrberechnen 
76.
77.
 
78.
If !DatumMonatszahl! equ 1 ( 
79.
call set /a "MonatsRest=0" 
80.
call set /a "SchaltjahrsMoeglichkeit=1" 
81.
echo Die MonatsRest Zahl betraegt: "!MonatsRest!" 
82.
echo  * Fuer den Monat Januar wurde die 
83.
echo  * Schaltjahrsmoeglichkeit auf 1 gesetzt. 
84.
goto Jahrberechnen 
85.
86.
 
87.
:Jahrberechnen 
88.
echo
89.
echo Es wird nun die Jahreszahl des Datums umgerechnet. 
90.
set /a "JahresRest=!DatumJahreszahl!/4" 
91.
set /a "JahresRest2=!DatumJahreszahl!+!JahresRest!" 
92.
set /a "JahresRest2=!JahresRest2!%%7" 
93.
echo Die JahresRest Zahl betraegt: "!JahresRest2!" 
94.
echo
95.
 
96.
:Jahrhundertberechnen 
97.
echo Es wird nun die Jahrhundertszahl des Datums umgerechnet. 
98.
set /a "JahrhundertsRest=!DatumJahrhundertszahl!%%4" 
99.
set /a "JahrhundertsRest2=3-!JahrhundertsRest!" 
100.
set /a "JahrhundertsRest2=!JahrhundertsRest2!*2" 
101.
echo Die JahrhundertsRest Zahl betraegt: "!JahrhundertsRest2!" 
102.
echo
103.
 
104.
:Schaltjahrberechnen 
105.
echo Es wird nun geprueft, ob ein Schaltjahr vorliegt. 
106.
set /a "SchaltjahrJa=1" 
107.
set /a "DatumJahrtausendSchaltjahr1=!DatumJahrtausendszahl!%%4" 
108.
set /a "DatumJahrtausendSchaltjahr2=!DatumJahrtausendszahl!%%100" 
109.
set /a "DatumJahrtausendSchaltjahr3=!DatumJahrtausendszahl!%%400" 
110.
echo DatumJahrtausendSchaltjahr1: "!DatumJahrtausendSchaltjahr1!" 
111.
echo DatumJahrtausendSchaltjahr2: "!DatumJahrtausendSchaltjahr2!" 
112.
echo DatumJahrtausendSchaltjahr3: "!DatumJahrtausendSchaltjahr3!" 
113.
echo
114.
 
115.
If not !DatumJahrtausendSchaltjahr1! equ 0 ( 
116.
echo Die Jahrtausendszahl ist nicht teilbar durch 4. 
117.
echo Daher liegt kein Schaltjahr vor. 
118.
) else
119.
If !DatumJahrtausendSchaltjahr3! equ 0 ( 
120.
call set /a "Schaltjahr=!SchaltjahrJa!" 
121.
echo Die Jahrtausendszahl ist teilbar durch 4, 100, 400. 
122.
echo Daher liegt ein Schaltjahr vor. 
123.
) else
124.
If !DatumJahrtausendSchaltjahr2! equ 0 ( 
125.
echo Die Jahrtausendszahl ist teilbar durch 4, 100, aber nicht durch 400. 
126.
echo Daher liegt kein Schaltjahr vor. 
127.
) ) ) 
128.
 
129.
If defined SchaltjahrsMoeglichkeit ( 
130.
If defined Schaltjahr ( 
131.
call set "Additionszeichen=+" 
132.
call set /a "Schaltjahrsparameter=6" 
133.
echo Schaltjahr aufgrund Monats fuer Berechnung bedeutsam. 
134.
) else
135.
echo Schaltjahr aufgrund Monats fuer Berechnung nicht bedeutsam. 
136.
) ) 
137.
 
138.
:Wochentagberechnen 
139.
set /a "WochentagsRest=!TagesRest!+!MonatsRest!+!JahresRest2!+!JahrhundertsRest2!!Additionszeichen!!Schaltjahrsparameter!" 
140.
set /a "WochentagsRest2=!WochentagsRest!%%7" 
141.
If !WochentagsRest2! equ 0 set "Wochentag=Sonntag" 
142.
If !WochentagsRest2! equ 1 set "Wochentag=Montag" 
143.
If !WochentagsRest2! equ 2 set "Wochentag=Dienstag" 
144.
If !WochentagsRest2! equ 3 set "Wochentag=Mittwoch" 
145.
If !WochentagsRest2! equ 4 set "Wochentag=Donnerstag" 
146.
If !WochentagsRest2! equ 5 set "Wochentag=Freitag" 
147.
If !WochentagsRest2! equ 6 set "Wochentag=Samstag" 
148.
 
149.
:End 
150.
echo
151.
echo
152.
echo Uebersicht: 
153.
echo
154.
echo Eingegebenes Datum:  "!DatumString!" 
155.
echo Formatiertes Datum:  "!DatumTageszahl!.!DatumMonatszahl!.!DatumJahrhundertszahl!!DatumJahreszahl!" 
156.
echo Reste von 
157.
echo     Tag:             "!TagesRest!" 
158.
echo     Monat:           "!MonatsRest!" 
159.
echo     Jahrhundert:     "!JahrhundertsRest2!" 
160.
echo     Jahr:            "!JahresRest2!" 
161.
echo
162.
echo Schaltjahr:          "!Schaltjahr!" 
163.
echo Schaltjahrsrelevanz: "!SchaltjahrsMoeglichkeit!" 
164.
echo Schaltjahrparameter: "!Schaltjahrsparameter!" 
165.
echo Auflistung aller 
166.
echo Summanden:           "!TagesRest!+!MonatsRest!+!JahrhundertsRest2!+!JahresRest2!!Additionszeichen!!Schaltjahrsparameter!" 
167.
echo Summe der Reste:     "!WochentagsRest!" 
168.
echo Rest der Reste:      "!WochentagsRest2!" 
169.
echo Wochentag:           "!Wochentag!" 
170.
echo
171.
echo
172.
echo
173.
echo Moechten Sie das Programm nochmal von vorne durchlaufen? 
174.
set /p "Wiederholung=Ja: [1] oder Nein: [2] ? " 
175.
If !Wiederholung! equ 1 goto Anfang 
176.
If !Wiederholung! equ 2 ( 
177.
echo
178.
echo Das Programm ist an seinem Ende. 
179.
echo
180.
181.
endlocal 
182.
pause 
183.
exit
Bitte warten ..
Mitglied: bastla
01.06.2011 um 17:11 Uhr
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
01.
@echo off & setlocal 
02.
set "String=1234567890123" 
03.
 
04.
set "StringTemp=%String%" 
05.
set /a L=0 
06.
:Loop 
07.
if "%StringTemp%"=="" goto :Done 
08.
set "StringTemp=%StringTemp:~1%" 
09.
set /a L+=1 
10.
goto :Loop 
11.
 
12.
:Done 
13.
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
Bitte warten ..
Neuester Wissensbeitrag
Microsoft

Lizenzwiederverkauf und seine Tücken

(5)

Erfahrungsbericht von DerWoWusste zum Thema Microsoft ...

Ähnliche Inhalte
Batch & Shell
gelöst Batch Abfrage Vergleiche mit Variable goto (4)

Frage von Zunaras zum Thema Batch & Shell ...

Batch & Shell
gelöst Batch Variable setzten mit Leerzeichen (3)

Frage von Marlon1 zum Thema Batch & Shell ...

Batch & Shell
Batch: Variable Expansion in einer FOR-Schleife (9)

Frage von .Sessl zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
LAN, WAN, Wireless
FritzBox, zwei Server, verschiedene Netze (17)

Frage von DavidGl zum Thema LAN, WAN, Wireless ...

Windows Netzwerk
Windows 10 RDP geht nicht (16)

Frage von Fiasko zum Thema Windows Netzwerk ...

Windows Server
Outlook Verbindungsversuch mit Exchange (15)

Frage von xbast1x zum Thema Windows Server ...