Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Variablen innerhalb For-Schleife geben immer letzten Eintrag der Liste

Frage Entwicklung Batch & Shell

Mitglied: sisiphus

sisiphus (Level 1) - Jetzt verbinden

24.11.2010 um 23:16 Uhr, 4515 Aufrufe, 5 Kommentare

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.

01.
@echo off 
02.
set LANGUAGES=de,en,es,dk 
03.
for %%i in (%LANGUAGES%) do ( 
04.
	echo c:/temp/%%i_programm.bat 
05.
	set LocalFile=c:/temp/%%i_programm.bat 
06.
	echo %LocalFile%  
07.
)
Weiß jemand Rat?

Danke
Sysiphus
Mitglied: 60730
24.11.2010 um 23:26 Uhr
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.

01.
:@echo off 
02.
set LANGUAGES=de,en,es,dk 
03.
for %%i in (%LANGUAGES%) do call :processlines %%i 
04.
goto eof 
05.
 
06.
:processlines 
07.
echo c:/temp/%1_programm.bat 
08.
	set LocalFile=c:/temp/%1_programm.bat 
09.
	echo %LocalFile%  
10.
:eof	 
11.
 
12.
pause
Gruß
Bitte warten ..
Mitglied: sisiphus
25.11.2010 um 19:34 Uhr
Danke!

Ich habe mich zunächt DelayedExpansion Expansion entschieden. Hat diese Methode gravierende Nachteile gegenüber "Trick 17"?
Gruß,
Bitte warten ..
Mitglied: pieh-ejdsch
25.11.2010 um 20:47 Uhr
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
Bitte warten ..
Mitglied: Biber
25.11.2010 um 21:21 Uhr
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.
01.
:: und dann erst wird EnableDelayedExpansion sexy 
02.
.... 
03.
:: im Bätschelchen 
04.
 
05.
FOR %%i in (de,en,es,dk) do set "localfile=!localfile_%%i!" &  call :aYellowSubroutine [Localfile=] !localfile! 
06.
goto :eof 
07.
 
08.
:aYellowsubroutine 
09.
:: Annahme - diese Routine existiert & funktioniert schon heute,  
10.
:: aber eben mit der Variablen %localfile% 
11.
machwasmit %Localfile% 
12.
.... 
13.
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
Bitte warten ..
Mitglied: sisiphus
26.11.2010 um 01:43 Uhr
Wow! Ich bin wieder beeindruckt von der Hilfsbereitschaft und Kompetenz in diesem Forum!
Gruß, Sisyphus
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(8)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
Batch & Shell
gelöst CMD: icacls in for-Schleife (2)

Frage von Lowrider614 zum Thema Batch & Shell ...

Batch & Shell
gelöst Batch Problem bei einer For Schleife (2)

Frage von Juergen42 zum Thema Batch & Shell ...

Batch & Shell
gelöst For Schleife kaputt? (5)

Frage von Peter32 zum Thema Batch & Shell ...

Batch & Shell
Batch: Variable Expansion in einer FOR-Schleife (9)

Frage von .Sessl zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Microsoft
Ordner mit LW-Buchstaben versehen und benennen (21)

Frage von Xaero1982 zum Thema Microsoft ...

Netzwerkmanagement
gelöst Anregungen, kleiner Betrieb, IT-Umgebung (18)

Frage von Unwichtig zum Thema Netzwerkmanagement ...

Windows Update
Treiberinstallation durch Windows Update läßt sich nicht verhindern (17)

Frage von liquidbase zum Thema Windows Update ...

Windows Tools
gelöst Aussendienst Datensynchronisierung (12)

Frage von lighningcrow zum Thema Windows Tools ...