benp
Goto Top

Batch: Elemente einer for-Schleife in Variable speichern

Hallo,

ich versuche in einer for-Schleife einen String zusammenzustellen. Als einfaches Beispiel diese beiden Zeilen:

SET path_libs=a
FOR %%f in (b c d) DO SET path_libs=%path_libs%;%%f

Ich erwarte eigentlich, dass danach path_libs den Wert "a;b;c;d" hat. Tatsächlich ist es aber "a;d". Versteht ihr das?
Zum Testen habe ich folgendes probiert:

FOR %%f in (b c d) DO echo %%f

oder auch

SET path_libs=a
SET path_libs=%path_libs%;b
SET path_libs=%path_libs%;c
SET path_libs=%path_libs%;d

Das geht wie erwartet. Nur die Kombination (s.o.) geht bei mir nicht.

Danke für jeden Tipp!
Benedikt

Content-Key: 37259

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

Ausgedruckt am: 29.03.2024 um 00:03 Uhr

Mitglied: Biber
Biber 03.08.2006 um 17:23:21 Uhr
Goto Top
Moin benp,

willkommen im Forum.
Such mal bitte über die Forumssuche oder in der CMD-Hilfe mit Set /? oder CALL /? nach "DelayedExpansion".

Kurzgefasst ist es so, dass die eine "FOR...IN..DO"-Anweisung genau einmal vom CMD-Interpreter interpretiert wird und alle darin enthaltenen Variablen (außer Zählvariablen) auch genau einmal expandiert/aufgelöst werden.

Zwei Strategien, wenn es anders sein soll:
a) Über Deklaration einer verzögerten Variablenauflösung:
Setlocal EnableDelayedExpansion
...
SET path_libs=a
FOR %%f in (b c d) DO SET path_libs=!path_libs!;%%f
Endlocal & Set path_libs=%path_libs%

b) Über den Aufruf eines geCALLeten Blocks außerhalb der FOR..IN..DO..-Zeile.
...
SET path_libs=a
FOR %%f in (b c d) DO call :sub %%f
goto :eof

:call sub 
SET path_libs=%path_libs%;%1
goto :eof

Hope That Helps
Biber
Mitglied: benp
benp 03.08.2006 um 18:32:53 Uhr
Goto Top
Hallo Biber,

wow, vielen Dank für deine Erklärung und Lösungen!
Sie funktionieren super! Allein wär ich da nie drauf gekommen.

Viele Grüße, Benedikt