sisyphusloughs
Goto Top

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.

@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

Content-Key: 155734

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

Ausgedruckt am: 29.03.2024 um 02:03 Uhr

Mitglied: 60730
60730 24.11.2010 um 23:26:37 Uhr
Goto Top
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.

:@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ß
Mitglied: Sisyphusloughs
Sisyphusloughs 25.11.2010 um 19:34:09 Uhr
Goto Top
Danke!

Ich habe mich zunächt DelayedExpansion Expansion entschieden. Hat diese Methode gravierende Nachteile gegenüber "Trick 17"?
Gruß,
Mitglied: pieh-ejdsch
pieh-ejdsch 25.11.2010 um 20:47:34 Uhr
Goto Top
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
Mitglied: Biber
Biber 25.11.2010 um 21:21:44 Uhr
Goto Top
Moin sissisfuss,


Zitat von @pieh-ejdsch:
gegenüber "Trick17" ist die "DelayedExpansion" marginal schneller.

Gruß Phil
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
Mitglied: Sisyphusloughs
Sisyphusloughs 26.11.2010 um 01:43:19 Uhr
Goto Top
Wow! Ich bin wieder beeindruckt von der Hilfsbereitschaft und Kompetenz in diesem Forum!
Gruß, Sisyphus