klimator
Goto Top

Batchfile MSDOS - Berechnung in verschachtelter FOR-Schleife

Hallo zusammen,

ich möchte in einer dreifach verschachtelten FOR-Schleife eine Berechnung auf Grundlage der drei hochgezählten Variablen vornehmen, doch es funktioniert leider nicht. Beispiel: Aus den Variablen j (2004), m (8) und t(6) - die Variablen stehen für Jahr, Monat, Tag - soll eine Datum-ID berechnet werden --> 20040806

Erst kam bei mir immer die Fehlermeldung "Fehlender Operand", nun blitzt beim Ausführen der .bat - Datei via Explorer immer nur kurz die Konsole auf und schließt dann wieder, ohne dass ich sehen kann, was das Programm tatsächlich macht. Kann mir jemand sagen, woran das liegt bzw. warum das nicht klappt?

__________________________
@echo ON

for /L %%j in (2001,1,2010) do (
for /L %%m in (1, 1, 12) do (
for /L %%t in (1, 1, 31) do (

set /a datumid=(%j%*10000)+(%m%*100)+(%t%)
echo %datumid%

)
)
)
____________________________

Danke!
Klimator

Content-Key: 281994

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

Printed on: April 23, 2024 at 23:04 o'clock

Member: miniversum
Solution miniversum Sep 04, 2015 updated at 14:32:16 (UTC)
Goto Top
Hallo,

Grundsätzlich ist es besser eine Batch immer in der Eingabeaufforderung auszuführen, da sonst nur ein kurzes Fenster zu sehen ist, wie du gemerkt hast.
So bekomms tdu auch die Fehlermeldungen und den Ablauf zu sehen.

For und Klammern vertragen sich nicht so gut.
Dazu kommt noch die Tatsache das innerhalb ein For Blockes Variabeln nicht aufgelöst werden. Hierfür müsstest du die verzögerte auflösung aktivieren (Stichwort: setlocal enabledelayedexpansion).

Alternativ übergibst du die 3 Variablen einer Unterprozedur die immer wieder aufgerufen wird. In dieser kannst Du dann auch normal rechnen und Ausgaben machen.
Das wäre dann so:
ECHO ON

for /L %%j in (2001,1,2010) do (
for /L %%m in (1, 1, 12) do (
for /L %%t in (1, 1, 31) do (

call:rechne %%j %%m %%t


)
)
)
goto:eof


:rechne
set /a datumid=(%1*10000)+(%2*100)+(%3)
echo %datumid%
goto:eof

Gruß
...
Member: Klimator
Klimator Sep 04, 2015 updated at 13:58:14 (UTC)
Goto Top
Hi,

aha, Danke für die Hilfe, es funktioniert!! Allerdings wenn ich den Code noch um eine weitere Variable erweitere:

for /L %%j in (2009,1,2010) do (
for /L %%m in (1,1,12) do (
for /L %%t in (1,1,31) do (
for /L %%s in (0,1,23) do (

call:rechne %%j %%m %%t %%s


)
)
)
goto:eof


:rechne
set /a datumid=(%1*1000000)+(%2*10000)+(%3*100)+(%4)
echo %datumid%
goto:eof

dann kommt die Fehlermeldung:

"+(*10000)+(*100)+(*)" kann synthaktisch an dieser Stelle nicht verarbeitet werden.

Liegt es evtl. daran, dass noch zwei Stellen in der Berechnung hinzugekommen sind und dass das der Rechner nicht packt?


Besten Gruß
Klimator
Member: Klimator
Klimator Sep 04, 2015 at 14:31:35 (UTC)
Goto Top
Ich habe es selber gefunden, es hat noch eine Klammer gefehlt in Zeil 12, da ich noch eine vierte Schleife aufgemacht habe.
Problem gelöst.