Variable aus mehreren Variablen zusammensetzen - in einer For Schleife
Moin,
ich scheitere gerade beim zusammenbasteln von Variablen. Ist vermutlich total idiotisch - ich komme aber gerade nicht drauf ...
1. Ich habe eine Anzahl Variablen Var10 - Var24 die entweder 0 oder 1 sind.
2. Mit einer For-Schleife möchte ich Var generieren und dann prüfen. Var ist ja immer fest, und nur die Zahl ändert sich. Also dachte ich etwas in der Form %Var%%i%
Das funktioniert nicht ... wie wäre denn richtig oder geht es so überhaupt nicht?
Zweiter Ansatz war
Wenn ich es so mache, wäre ja TmpVar zwar gleich der Variablen VarXX aber ich möchte ja den Inhalt der Variablen VarXX und nicht den Inhalt VarXX
Hilfe ....
Gruß
Nagus der verzweifelte
ich scheitere gerade beim zusammenbasteln von Variablen. Ist vermutlich total idiotisch - ich komme aber gerade nicht drauf ...
1. Ich habe eine Anzahl Variablen Var10 - Var24 die entweder 0 oder 1 sind.
2. Mit einer For-Schleife möchte ich Var generieren und dann prüfen. Var ist ja immer fest, und nur die Zahl ändert sich. Also dachte ich etwas in der Form %Var%%i%
set/A Var10=0
set/A Var12=1
set/A Var14=0
set/A Var24=0
for /L %%i in (10,1,24) do %Var%%i%==1 echo Var10= Ja else echo Var10= Nein
Zweiter Ansatz war
for /L %%i in (10,1,24) do set TmpVar=Var%%i && if %TmpVar%==1 echo Var10= Ja else echo Var10= Nein
Wenn ich es so mache, wäre ja TmpVar zwar gleich der Variablen VarXX aber ich möchte ja den Inhalt der Variablen VarXX und nicht den Inhalt VarXX
Hilfe ....
Gruß
Nagus der verzweifelte
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 158050
Url: https://administrator.de/forum/variable-aus-mehreren-variablen-zusammensetzen-in-einer-for-schleife-158050.html
Ausgedruckt am: 09.04.2025 um 05:04 Uhr
9 Kommentare
Neuester Kommentar
Hallo Verzweifelter
!
Was Du vermutlich möchtest, ist:
oder ev auch:
Grüße
bastla
Was Du vermutlich möchtest, ist:
@echo off & setlocal enabledelayedexpansion
set/A Var10=0
set/A Var12=1
set/A Var14=0
set/A Var24=0
for /L %%i in (10,1,24) do if !Var%%i!==1 (echo Var%%i=Ja) else (echo Var%%i=Nein)
@echo off & setlocal enabledelayedexpansion
set/A Var10=0
set/A Var12=1
set/A Var14=0
set/A Var24=0
for /L %%i in (10,1,24) do if defined Var%%i if !Var%%i!==1 (echo Var%%i=Ja) else (echo Var%%i=Nein)
bastla
Hallo Nagus!
Das "@echo off" bedeute0 (auseinandergerissen):
"@":Zeige den Nachfolgenden Befehl nicht an
"echo off" Schalte die Ausgabe aus; So wird nur noch das angezeigt, was du mit "echo" ausgeben willst
Das "&": Verknüpft Befehle (in eine neue Zeile Schreiben ginge auch)
Das "setlocal enabledelayedexpansion ":Schaltet die verzögerte Variablenexpansion ein.
Das bedeutet: Normalerweise wird ein Befehl vom Interpreter(cmd) angeschaut und alle Variablen durch den Wert ersetzt. Dann wird der Befehl ausgeführt.
Das Problem: Eine For-Schleife ist ein Befehl--> Das heisst, alle verwendeten Variablen werden am Anfang durch ihren Inhalt ersetzt und dann die Schleife abgearbeitet. (Ausnahme: Die Laufvariablen (zB: %%A))
Ist die verzögerte Variablenexpansion eingeschaltet, kann man dem Interpreter sagen, dass er die Variablen zB. in jedem Durchgang erneut auswerten soll. Dies geschieht durch die "!" (statt den "%")
-->(Obiges Beispiel):
Der Ausdruck "!Var%%i!" heisst: Schaue in jedem Schleifendurchgang den Wert der Variable an. Also:
1. Durchgang: Var1= ?
2. Durchgang: Var2= ?
3. Durchgang: Var3= ?
...
Hier ein anderes Beispiel:
[edit: Nachtrag:
Das von dir verwendete "%var%%i%" hat noch ein Problem: Der Interpreter sucht nach zwei Variablen: %var% und %i%.
Dies ist auch der Fall wenn man zB. ausserhalb eine Schleife den Inhalt eine Variable mit einer Variable im Namen verwenden will: Etwa "%Variable%Namenszusatz%%"
Der Interpreter würde nach %Variable% und %% suchen (der Teil "Namenszusatz") würde einfach als Zeichenkette angesehen werden
Deshalb kann man in dem Fall auch ausserhalb einer Schleife die "!" verwenden (nur mit "setlocal enabledelayedexpansion")
Beispiel:
]
Ich hoffe es ist verständlich
Mathe172
Das "@echo off" bedeute0 (auseinandergerissen):
"@":Zeige den Nachfolgenden Befehl nicht an
"echo off" Schalte die Ausgabe aus; So wird nur noch das angezeigt, was du mit "echo" ausgeben willst
Das "&": Verknüpft Befehle (in eine neue Zeile Schreiben ginge auch)
Das "setlocal enabledelayedexpansion ":Schaltet die verzögerte Variablenexpansion ein.
Das bedeutet: Normalerweise wird ein Befehl vom Interpreter(cmd) angeschaut und alle Variablen durch den Wert ersetzt. Dann wird der Befehl ausgeführt.
Das Problem: Eine For-Schleife ist ein Befehl--> Das heisst, alle verwendeten Variablen werden am Anfang durch ihren Inhalt ersetzt und dann die Schleife abgearbeitet. (Ausnahme: Die Laufvariablen (zB: %%A))
Ist die verzögerte Variablenexpansion eingeschaltet, kann man dem Interpreter sagen, dass er die Variablen zB. in jedem Durchgang erneut auswerten soll. Dies geschieht durch die "!" (statt den "%")
-->(Obiges Beispiel):
Der Ausdruck "!Var%%i!" heisst: Schaue in jedem Schleifendurchgang den Wert der Variable an. Also:
1. Durchgang: Var1= ?
2. Durchgang: Var2= ?
3. Durchgang: Var3= ?
...
Hier ein anderes Beispiel:
@echo off
set /a "Var=0"
echo Ohne verzögerter Variablenexpansion:
REM Hier schaut der Interpreter den Inhalt der Varaible am Anfang an: Der Wert ist "0". Nun rechnet er in jedem Durchgang 0+1=1
for /L %%A in (1,1,10) do set /a Var=%Var%+1
echo %Var%
setlocal enabledelayedexpansion
set /a "Var=0"
echo Mit verzögerter Variablenexpansion:
REM Hier schaut der Interpreter den Inhalt der Varaible in jedem Durchgang an: Der Wert ist am Anfang 0. Nun rechnet er im 1. Durchgang: 0+1=1
REM Im 2. schaut er wieder den WErt von Var an:1
Nun rechnet er im 2. Durchgang: 1+1=2
for /L %%A in (1,1,10) do set /a Var=!Var!+1
REM Wichtig: Mit "!" einschliessen!
echo %Var%
[edit: Nachtrag:
Das von dir verwendete "%var%%i%" hat noch ein Problem: Der Interpreter sucht nach zwei Variablen: %var% und %i%.
Dies ist auch der Fall wenn man zB. ausserhalb eine Schleife den Inhalt eine Variable mit einer Variable im Namen verwenden will: Etwa "%Variable%Namenszusatz%%"
Der Interpreter würde nach %Variable% und %% suchen (der Teil "Namenszusatz") würde einfach als Zeichenkette angesehen werden
Deshalb kann man in dem Fall auch ausserhalb einer Schleife die "!" verwenden (nur mit "setlocal enabledelayedexpansion")
Beispiel:
@echo off & setlocal enabledelayedexpansion
REM 20 Varaiblen mit Inhalt erzeugen:
For /L %%A in (1,1,20) do set "Var%%A=%%A"
:Loop
set /p "VarNr=Von der wievielten Variable willst du den Wert wissen? "
echo Ohne verzögerter Variablenexpansion: %Var%VarNr%%
echo Mit verzögerter Variablenexpansion: !Var%VarNr%!
pause>nul
cls
goto :Loop
Ich hoffe es ist verständlich
Mathe172
Moin Nagus,
Was passiert denn, wenn du einen Busfahrschein in den ec-Kartenleser an der Supermarktkasse schiebst?
Oder wenn du versuchst einen Pudding zu toasten?
Batch ist zwar manchmal etwas kryptisch, aber ein klitzekleines Bisschen hat es doch mit den ansonsten üblichen Gesetzen der Logik zu tun.
Nochmal: "verzögerte Variablenauflösung" funktioniert nur unter zwei Bedingungen
a) es muss von dir angekündigt werden wie ein "Kontra" beim Doppelkopf, nur auf outlandish mit "SetLocal EnableDelayedExpansion".
b) nach der Ankündigung kannst du sowohl Variablen "wie immer" anfassen als %variable% -oder- als !variable! "verzögert"==im letzten Moment ermittelt.
wenn Bedingung a) nicht gegeben ist, dann hast du gar keine Oder-Option bei b), denn du kannst gar keine !variable!'n ansprechen.
Oder beim Doko: wenn du nicht "kontra" angesagt hast, dann zählt nix doppelt.
Grüße
Biber, der geduldige
Was passiert denn, wenn du einen Busfahrschein in den ec-Kartenleser an der Supermarktkasse schiebst?
Oder wenn du versuchst einen Pudding zu toasten?
Batch ist zwar manchmal etwas kryptisch, aber ein klitzekleines Bisschen hat es doch mit den ansonsten üblichen Gesetzen der Logik zu tun.
Nochmal: "verzögerte Variablenauflösung" funktioniert nur unter zwei Bedingungen
a) es muss von dir angekündigt werden wie ein "Kontra" beim Doppelkopf, nur auf outlandish mit "SetLocal EnableDelayedExpansion".
b) nach der Ankündigung kannst du sowohl Variablen "wie immer" anfassen als %variable% -oder- als !variable! "verzögert"==im letzten Moment ermittelt.
wenn Bedingung a) nicht gegeben ist, dann hast du gar keine Oder-Option bei b), denn du kannst gar keine !variable!'n ansprechen.
Oder beim Doko: wenn du nicht "kontra" angesagt hast, dann zählt nix doppelt.
Grüße
Biber, der geduldige
@mathe172
Und dann wäre da noch:
Grüße
bastla
Und dann wäre da noch:
set /a "Var=0"
for /L %%A in (1,1,10) do set /a Var+=1
echo %Var%
bastla