Variablen innerhalb For-Schleife geben immer letzten Eintrag der Liste
Ich möchte anhand einer Komma-getrennten Liste, Variablen in einer For-Schleife zusammen setzen, bekomme aber immer der Variable den letzen Eintrag der Liste... Was mache ich falsch?
Hallo,
Der folgende Schnipsel gibt mir zwar per echo c:/temp/%%i_programm.bat genau den Dateinamen an, den ich brauche. Aber sobald ich versuche den Pfad in eine Variable zu speichern erscheint immer nur ein zusammengeseztzte Zeile mit c:/temp/dk_programm.bat.
Weiß jemand Rat?
Danke
Sysiphus
Hallo,
Der folgende Schnipsel gibt mir zwar per echo c:/temp/%%i_programm.bat genau den Dateinamen an, den ich brauche. Aber sobald ich versuche den Pfad in eine Variable zu speichern erscheint immer nur ein zusammengeseztzte Zeile mit c:/temp/dk_programm.bat.
@echo off
set LANGUAGES=de,en,es,dk
for %%i in (%LANGUAGES%) do (
echo c:/temp/%%i_programm.bat
set LocalFile=c:/temp/%%i_programm.bat
echo %LocalFile%
)
Weiß jemand Rat?
Danke
Sysiphus
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 155734
Url: https://administrator.de/forum/variablen-innerhalb-for-schleife-geben-immer-letzten-eintrag-der-liste-155734.html
Ausgedruckt am: 09.01.2025 um 01:01 Uhr
5 Kommentare
Neuester Kommentar
moin,
entweder benutzt du DelayedExpansion, oder du nimmst den Bastla Weg, der den Trick 17 nimmt nicht innerhalb einer For Schleife (und damit in einer Zeile) etwas zu setzen und zu verwerten.
Gruß
entweder benutzt du DelayedExpansion, oder du nimmst den Bastla Weg, der den Trick 17 nimmt nicht innerhalb einer For Schleife (und damit in einer Zeile) etwas zu setzen und zu verwerten.
:@echo off
set LANGUAGES=de,en,es,dk
for %%i in (%LANGUAGES%) do call :processlines %%i
goto eof
:processlines
echo c:/temp/%1_programm.bat
set LocalFile=c:/temp/%1_programm.bat
echo %LocalFile%
:eof
pause
Gruß
moin miteinander,
@sisphus
der einzige Nachteil von "Setlocal EnableDelayedExpansion" ist, dass AusrufeZeichen im Ergebnis (in der For-Variable) eines Satzes der Forschleife fehlen.
wenn Du die AusrufeZeichen in der For-Variable wiederhaben möchtest muss Du "Endlocal" vorher ausführen.
wenn "Setlocal EnableDelayedExpansion" innerhalb der For-Schleife gemacht wird - erst nach dem "Endlocal" Befehl die For-Variable in eine UmgebungsVariable speichern - sonst ist sie nach Beendigung der For-Schleife nicht mehr gesetzt.
nach Ende der For-Schleife wirst Du immer nur eine gesetzte Variable haben, weil Du ja die vorhergehenden wieder überschreibst.
gegenüber "Trick17" ist die "DelayedExpansion" marginal schneller.
Gruß Phil
@sisphus
der einzige Nachteil von "Setlocal EnableDelayedExpansion" ist, dass AusrufeZeichen im Ergebnis (in der For-Variable) eines Satzes der Forschleife fehlen.
wenn Du die AusrufeZeichen in der For-Variable wiederhaben möchtest muss Du "Endlocal" vorher ausführen.
wenn "Setlocal EnableDelayedExpansion" innerhalb der For-Schleife gemacht wird - erst nach dem "Endlocal" Befehl die For-Variable in eine UmgebungsVariable speichern - sonst ist sie nach Beendigung der For-Schleife nicht mehr gesetzt.
nach Ende der For-Schleife wirst Du immer nur eine gesetzte Variable haben, weil Du ja die vorhergehenden wieder überschreibst.
gegenüber "Trick17" ist die "DelayedExpansion" marginal schneller.
Gruß Phil
Moin sissisfuss,
Noch marginal schneller wäre eine Änderung der Strategie:
[Demo am CMD-Prompt; die erste Zeile ist der Befehl, der bitte ohne ">" eingegeben werden sollte]
Wenn diese %LOCALFILE%-Variablen einmal gesetzt sind, dann kann ebenso wieder auch an jeder Stelle des Batch-Schnipsel bei Bedarf eine "universelle Variable" %localfile% gebildet werden, falls dieser Code jetzt schon existiert und mit %localfile% weiterverwendet werden soll.
Auch hier wieder Demo am CMD-Prompt:
Nur - wenn wir das so durchgespielt haben, dann erkennen wir doch, dass sowohl das Setzen EINER Variablen wie auch das Setzen von FÜNF Variablen %Localfile_xy% überflüssig ist.
Es liesse sich ohne irgendwelche Informationsverluste auch ganz mit den dynamischen Laufvariablen %%i abfackeln.
Grüße
Biber
Noch marginal schneller wäre eine Änderung der Strategie:
[Demo am CMD-Prompt; die erste Zeile ist der Befehl, der bitte ohne ">" eingegeben werden sollte]
>@(for %i in (de,en,es,dk) do @set "LocalFile_%i=c:\temp\%i_programm.bat" ) & set localfile
LocalFile_de=c:\temp\de_programm.bat
LocalFile_dk=c:\temp\dk_programm.bat
LocalFile_en=c:\temp\en_programm.bat
LocalFile_es=c:\temp\es_programm.bat
Wenn diese %LOCALFILE%-Variablen einmal gesetzt sind, dann kann ebenso wieder auch an jeder Stelle des Batch-Schnipsel bei Bedarf eine "universelle Variable" %localfile% gebildet werden, falls dieser Code jetzt schon existiert und mit %localfile% weiterverwendet werden soll.
:: und dann erst wird EnableDelayedExpansion sexy
....
:: im Bätschelchen
FOR %%i in (de,en,es,dk) do set "localfile=!localfile_%%i!" & call :aYellowSubroutine [Localfile=] !localfile!
goto :eof
:aYellowsubroutine
:: Annahme - diese Routine existiert & funktioniert schon heute,
:: aber eben mit der Variablen %localfile%
machwasmit %Localfile%
....
goto :eof
Auch hier wieder Demo am CMD-Prompt:
(=21:18:11 D:\temp=)
>@for %i in (de,en,es,dk) do @set "localfile=!localfile_%i!" & echo call :aYellowSubroutine [Localfile=] !localfile!
call :aYellowSubroutine [Localfile=] c:\temp\de_programm.bat
call :aYellowSubroutine [Localfile=] c:\temp\en_programm.bat
call :aYellowSubroutine [Localfile=] c:\temp\es_programm.bat
call :aYellowSubroutine [Localfile=] c:\temp\dk_programm.bat
Nur - wenn wir das so durchgespielt haben, dann erkennen wir doch, dass sowohl das Setzen EINER Variablen wie auch das Setzen von FÜNF Variablen %Localfile_xy% überflüssig ist.
Es liesse sich ohne irgendwelche Informationsverluste auch ganz mit den dynamischen Laufvariablen %%i abfackeln.
Grüße
Biber