juergenl
Goto Top

Umgang mit externen Variablen innerhalb einer FOR ... DO Schleife ...

Hallo BATCH'elors ..

mein oben beschriebene Aufgabenstellung habt Ihr Euch sicher längt an den Schuhsolen abgelaufen .. - ich bitte daher höflich um Eure - nachsichtige - Hilfe:

Ich wüßte gerne, wie man in einer (zudem verschachtelten) FOR-Schleife mit solchen (externen) Variablen umgehen muß, die nicht zum internen Vorrat, wie %%i , %%j gehören:

1.) Ich versuche, mit Hilfe einer geschachtelten FOR-DO-Schleife, Bildschirm-Farben ("COLOR xy") je nach Farb- und Helligkeits-Kontrast auf günstige Brauchbarkeit zu untersuchen ...

2.) Dabei würde ich gerne innerhalb der Schleife einen Zählvorgang - etwa bezüglich brauchbar erscheinender Farbkombinationen - in Gang setzen: Als Neuling habe ich zunächst ausserhalb der Schleife - zwecks Initialisierung der Variablen 'lfdnum' begonnen mit

SET /A lfdnum=0

- danach wollte ich bei jedem Treffer innerhalb der Schleife fortsetzen mit

SET /A lfdnum=%lfdnum% + 1

Dieses Vorgehen ist mir in harmloseren Fällen (Geradeaus-Programmierung, auch in SUB-Routinen) durchaus bereits gelungen. Hingegen schaffe ich es nicht, - experimentell, etwa per Verdopplung von Prozent-Zeichen o.ä. - die Variable 'lfdnum' innerhalb der Schleife - im Fall dortiger Erfolgs-Treffer - zu inkrementieren.

- dabei begehe ich vielmehr wohl einen grundsätzlichen - formalen - Fehler, - was die "Welten" der Variablen innerhalb und ausserhalb solcher Schleifen betrifft. Dies verläuft im übrigen aber ohne jede berüchtigte Fehlermeldung "Syntaxfehler".

- würde mich mich bitte jemand über dieses Dilemma aufkläen .. - danke im Voraus für jede erdenkliche Hilfe!

Mit freundlichen Grüßen
Juergenl

Content-ID: 247375

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

Ausgedruckt am: 22.11.2024 um 12:11 Uhr

bastla
Lösung bastla 25.08.2014, aktualisiert am 26.08.2014 um 18:50:10 Uhr
Goto Top
Hallo Juergenl!

Wenn Du nur zählen willst, einfach
set /a lfdnum+=1
und die Anzahl nach Beendigung der Schleife ausgeben.

Willst Du den aktuellen Wert des Zählers auch innerhalb der Schleife verwenden / ausgeben, benötigst Du "delayedExpansion" (siehe zB Tutorial zur FOR-Schleife) - etwa:
@echo off & setlocal enabledelayedexpansion
set /a lfdnum=0
for /L %%i in (1,1,7) do if %%i lss 5 set /a lfdnum+=1 & echo Anzahl: !lfdnum!
Grüße
bastla
Juergenl
Juergenl 26.08.2014 aktualisiert um 18:52:11 Uhr
Goto Top
Hallo Bastla,

besten Dank für Deine schnelle Hilfe! Damit ist nicht nur dieses Problem gelöst, - vielmehr habe ich damit auch weitere Erfahrungen gewonnen ...

Die kompakte Notation SET /A lfdnum+=1 zum Inkrementieren der Schleifenvariablen ist durchaus praktisch, war mir aber nicht (mehr?) geläufig. Ab jetzt gehört sie also zu 'meinem' Befehlsvorrat.

Mein vorheriges Mißverständnis lag im übrigens an anderer Stelle: Die Schreibweise

SET /A lfndnum=%lfndnum% + 1

scheitert hier offenbar an der falschen Variablen-Auflösung %lfdnum%: Wenn man nämlich diesen Ausdruck durch !lfdnum! ersetzt, funktioniert auch das innerhalb meiner FOR-Schleife. ( - ich habe offenbar diese Strategie - oder Regeln - zur Erweiterung von Variablen immer noch nicht richtig verstanden: In dieser Situation werde ich wohl jedes Mal wieder experimentieren müssen .. )

Danke auch für den Hinweis auf 'EnableDelayedExpansion': Diese Option habe ich hier auch angewendet, weil ich innerhalb dieser FOR-Schleife regelmäßig Einträge in eine Textdatei vornehmen will, wobei gerade diese Variable %lfdnum% eine bestimmende Rolle spielt.

Danke noch einmal und freundliche Grüße

Jürgen
<Juergenl>
bastla
Lösung bastla 26.08.2014, aktualisiert am 27.08.2014 um 06:57:56 Uhr
Goto Top
Hallo Juergenl!

Freut mich, wenn's hilft ... face-smile

... und BTW: Die Schreibweise "!lfdnum!" ergibt sich ja aus der Verwendung der "delayedExpansion" ("!" anstatt "%" dient der Kennzeichnung jener Variablen, die "verzögert" - also nicht schon bei Beginn der Verarbeitung zB der Schleife - aufgelöst / ausgewertet werden sollen) ...

Grüße
bastla
Juergenl
Juergenl 27.08.2014 um 07:02:34 Uhr
Goto Top
Hallo Bastla,

DAS ist doch eine klare Ansage! Ich habe mir die Zusammenhänge jetzt auch in allen Varianten praktisch vor Augen geführt, - hat geholfen!

Danke und freundliche Grüße

Jürgen
<Juergenl>