michael-24
Goto Top

Variablen außerhalb einer For Schleife abfragen

Hallo miteinander,

ich habe ein Problem, bei dem ich überhaupt nicht weiter komme.

Ich möche ein kleine Batchdatei erstellen, mit der ich aus einer csv-Datei alle Werte auslese und diese in Variable speichere. Soweit funktioniert das eigentlich schon, aber die Variablen sind nur innerhalb der For Schleife abrufbar.

So sieht mein jetztiger Code aus:

for /f "skip=1 tokens=1-4 delims=;" %%A in (%CSVFILE%) do (  
	Set Var%x%=%%A
	echo !Var%x%!
	
	Set /a x=%x%+1
	Set Var%x%=%%B
	echo !Var%x%!

	Set /a x=%x%+1
	Set Var%x%=%%C
	echo !Var%x%!

	Set /a x=%x%+1
	Set Var%x%=%%D
	echo !Var%x%!

	set /a x=%x%+4
)
echo %x%
:: Hier wird 4 ausgegeben

echo Var%x%
:: Hier wird Var4 statt der Variableninhalt von Var4 ausgegeben
pause

Innerhalb der For Schleife werden die tatsächlichen Werte, die in der CSV gespeichert sind, ausgegeben. Nicht so außerhalb der For Schleife. Das will ich aber face-smile

Kann man das irgendwie realisieren?

Vielen Dank
Michael

CSVDatei sieht ungefähr so aus.
Beschreibung;Beschreibung2;Beschreibung3;Beschreibung4
Wert 1;Wert 2;Wert 3;Wert 4
Wert 5;Wert 6;Wert 7;Wert 8

Content-Key: 279111

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

Printed on: April 18, 2024 at 07:04 o'clock

Member: Endoro
Endoro Aug 03, 2015 updated at 15:06:22 (UTC)
Goto Top
Hey,
die Variable "Var4" wird nur erzeugt, wenn du "x" entsprechend initialisierst, "set /a x=1". Dann wirst du feststellen, dass "x" nach Beendigung der for-Schleife den Wert "5" hat. Um zu sehen, welche Variablen tatsächlich entstanden sind, füge "set var" vor "pause" in dein Skript ein.
Gruß, Endoro
Member: Biber
Solution Biber Aug 03, 2015 updated at 18:10:29 (UTC)
Goto Top
Moin Michael-24,

ich glaube, du meinst es eher so:
@echo off & setlocal enabledelayedexpansion
set "csvfile=d:\bitte\anpassen\@michael-24\testcsvfile.csv"  
set /a rec=0

for /f "usebackq skip=1 tokens=1-4 delims=;" %%A in ("%CSVFILE%") do (  
    set /a rec+=1
  
	Set #!rec!_A=%%A
  	Set #!rec!_B=%%B
	Set #!rec!_C=%%C
    Set #!rec!_D=%%D
	
)
echo Hier wird alles, was #* heisst ausgegeben
set #
::  Hier wird alles, was var* heisst ausgegeben
pause
set rec-=1
::  Hier wird alles, was #* heisst in einer FOR /L-Anweisung ausgegeben
For /L %%i in (1, 1, %rec%) do (
  echo Rec #%%i: !#%%i_A!;!#%%i_D!;!#%%i_C!;!#%%i_D!
)
pause

Auf diese Weise ürde ich quasi ein 2-dimensionales Variablen-Array nachbilden, wobei dann #2_D dann denn Wert von Satz 2, Feld D bedeuten.
Also ähnlich wie die Zeilen/Spaltenüberschriften aus Excel oder Calc.

Wobei ich aber nicht wüsste, was ich mit dem dritten Wert aus Zeile 2075 denn in einer Variablen #2075_C anfangen soll - also der Sinn dieses In-Variablen-Packen ist mir nicht klar.

Wenn ich das laufen lasse (inkl. der beiden Debug-Ausgaben "Hier wird alles ausgegeben...") , dann erhalte ich am CMD-Prompt:
Hier wird alles, was #* heisst ausgegeben
#1_A=Wert 1
#1_B=Wert 2
#1_C=Wert 3
#1_D=Wert 4
#2_A=Wert 5
#2_B=Wert 6
#2_C=Wert 7
#2_D=Wert 8
Drücken Sie eine beliebige Taste . . .
Rec #1: Wert 1;Wert 4;Wert 3;Wert 4
Rec #2: Wert 5;Wert 8;Wert 7;Wert 8

Grüße
Biber
Member: Michael-24
Michael-24 Aug 03, 2015 updated at 18:13:40 (UTC)
Goto Top
Hallo Biber,
hallo Endoro,

vielen Dank für eure Beiträge. Bibers Lösung war super. Das ist genau, was ich gesucht habe.

@echo off & setlocal enabledelayedexpansion
set "csvfile=Pfad zur CSV Datei"  
set /a rec=0

for /f "skip=1 usebackq skip=1 tokens=1-4 delims=;" %%A in ("%CSVFILE%") do (  
    set /a rec+=1
  
	Set #!rec!_A=%%A
  	Set #!rec!_B=%%B
	Set #!rec!_C=%%C
        Set #!rec!_D=%%D
	
)
echo !#1_A!
echo !#1_B!
echo !#1_C!
echo !#1_D!

pause

Jetzt kann ich mir ein Auswahlmenü zusammenbasteln, in Abhängigkeit der Einträge in der CVS Datei. Hintergrund. Die Batchdatei muss ich immer in die Boot.WIM integrieren. Ich möchte mir die Batchdatei variable programmieren und die CSV mit den Menüeinträgen soll ins Rootverzeichnis des USB Sticks. Somit brauch ich nur die CSV Datei anpassen und nicht immer die Boot.WIM mounten, die Batchdatei reinkopieren und das Image wieder unmounten. Sehr cool.

Vielen Dank nochmal.

Gruß
Michael