Forum: PC-Programmierung For-Schleife in Batch-File mit Environment Variable


von Markus (Gast)


Lesenswert?

Hallo Zusammen,

ich habe folgendes Problem:

Ich will in einer Win32 Batch ein File (my_list.txt) das eine Liste von 
Dateinamen enthält zeilenweise einlesen. Jede eingelesene Zeile soll 
nacheinander an eine Umgebungsvariable angehängt werden. Ein 
Beispiel...

Batch Code
1
set MY_VAR=init
2
3
for /f "tokens=*" %%A in (my_list.txt) do (    
4
    echo %%A
5
    set MY_VAR=%MY_VAR% %%A
6
)
7
8
echo %MY_VAR%
Angenommen my_list.txt hat den Inhalt:
../../myfile_1.vhd
../../myfile_2.vhd
../../myfile_3.vhd

dann soll MY_VAR am Ende den Wert

MY_VAR=init ../../myfile_1.vhd ../../myfile_2.vhd ../../myfile_3.vhd

enthalten.

Soweit so gut. Das Einlesen aus dem File klappt. Allerdings läuft es 
etwas anders ab als geplant:

Antwort in Console
1
echo ../../myfile_1.vhd
2
set MY_VAR=init ../../myfile_1.vhd
3
4
echo ../../myfile_2.vhd
5
set MY_VAR=init ../../myfile_2.vhd
6
7
echo ../../myfile_3.vhd
8
set MY_VAR=init ../../myfile_3.vhd
9
10
echo init

Es scheint so, dass die Zuweisung
1
set MY_VAR=%MY_VAR% %%A

nur lokal gültig ist. Die Variable konkateniert sich nicht auf sondern 
behält am Ende ihren Initialwert.

Ich hab schon duzendfach rumprobiert aber bekomme das einfach nicht 
gebacken. Ich hoffe ihr könnt mir helfen.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Sieh Dir mal die Onlinedokumentation* für SET an, hier insbesondere auf 
"verzögerte Erweiterung von Variablen" achten.




*) Im Konsolenfenster eingeben "help set"

von Rainer V. (rudi994)


Lesenswert?

Bei mir funktioniert es bestens, wenn ich aus der Klammer am Ende des 
FOR-Befehls den SET-Befehl herausnehme, in eine eigene Stapeldatei 
schreibe und diese in der Klammer als externes Unterprogramm aus dem 
FOR-Befehl heraus aufrufe.

Beim Aufruf übergebe ich die FOR-Variable %%A als Parameter des 
Unterprogramms und verwende im Unterprogramm den Dummy-Parameter %1 
anstelle von %%A, die Befehlszeile lautet :  set MY_VAR=%MY_VAR% %1

CMD /V:ON oder CMD /V:OFF (Ein-/Ausschalten der verzögerten Erweiterung 
von Variablen) hat keinen Erfolg gebracht, weder bei Eingabe unter 
"Ausführen" noch bei Eingabe auf der Commando-Ebene selbst. Den SET- 
Befehl habe ich auch mal ohne Klammer und ECHO-Befehl direkt an das Ende 
der FOR-Befehlszeile gesetzt. Dadurch hat sich aber nichts verbessert.

Übrigends wurde bei CMD /V:ON bzw. CMD /V:OFF unter "Ausführen" jedesmal 
das Laufwerksverzeichnis auf C:\Windows\System32 gesetzt. Das fand ich 
schon sehr lästig.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Nur so am Rande bemerkt: Wem die syntaktischen Möglichkeiten des 
windows-eigenen Kommandozeileninterpreter nicht ausreichen, der kann 
auch VBScript oder JavaScript verwenden. Der dafür erforderliche 
Interpreter (wscript.exe resp. cscript.exe) ist seit längerem im 
Standardlieferumfang von Windows enthalten.

Beides, VBScript und JavaScript, ist in Sachen Stringverarbeitung, 
Variablenbehandlung etc. doch etwas, äh, überlegener.

Was wscript.exe leider nicht bietet, ist der Zugriff auf GUI-Elemente; 
man kann damit also keine interaktiven Windows-Dialoge zusammenbasteln. 
Sehr viel mehr als einfache MessageBox-Aufrufe sind damit nicht möglich.

Die für die Kommandozeile gedachte Variante cscript.exe hingegen kann 
Konsole-I/O betreiben.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.