nagus
Goto Top

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 ... face-sad

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
Das funktioniert nicht ... wie wäre denn richtig oder geht es so überhaupt nicht?

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

Content-Key: 158050

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

Printed on: April 23, 2024 at 14:04 o'clock

Member: bastla
bastla Jan 05, 2011 at 14:09:33 (UTC)
Goto Top
Hallo Verzweifelter face-wink!

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)
oder ev auch:
@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)
Grüße
bastla
Member: Nagus
Nagus Jan 05, 2011 at 17:55:44 (UTC)
Goto Top
Jippiiieeee!
Genau so funktioniert es! Deine Zweite Lösung ist sogar noch passender!

Aber jetzt möchte ich es auch noch verstehen:
@echo off & setlocal enabledelayedexpansion 
Dadurch werden erst alle Werte in der For Schleife angezeigt. Warum brauche ich das?

Was passiert durch die ! bei !Var%%i!==1 ??? Offensichtlich kann ich mir die Variablen auch per echo !Variable! anzeigen lassen. Was ist der Unterschied zu %Variable%? Ich kannte bisher nur das ....

Viele Grüße
Nagus der glückliche face-wink
Member: mathe172
mathe172 Jan 05, 2011 at 18:49:15 (UTC)
Goto Top
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:
@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 face-smile
Mathe172
Member: Nagus
Nagus Jan 05, 2011 at 19:30:36 (UTC)
Goto Top
Hi Mathe172,
danke erstmal für die Ausführliche Erklärung!

Das mit dem @echo off ist klar face-wink Ein bisschen Ahnung habe ich schon ....

setlocal enabledelayedexpansion war nicht so klar, aber habe ich verstanden.

Das heißt doch: wenn ich die Verzögerung nutze - muss ich ! anstatt % nehmen. Mit diesem Ausdruck %Variable% würde ich also immer den ersten Wert bekommen.

Was passiert bei !Variable! ohne enabledelayedexpansion?

Viele Grüße
Nagus der erleuchtete
Member: Biber
Biber Jan 05, 2011 at 19:44:56 (UTC)
Goto Top
Moin Nagus,


Zitat von @Nagus:
Was passiert bei !Variable! ohne enabledelayedexpansion?
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
Member: bastla
bastla Jan 05, 2011 at 19:48:33 (UTC)
Goto Top
@mathe172

Und dann wäre da noch:
set /a "Var=0"  
for /L %%A in (1,1,10) do set /a Var+=1
echo %Var%
Grüße
bastla
Member: jeb-the-batcher
jeb-the-batcher Jan 05, 2011 at 21:36:47 (UTC)
Goto Top
Dank der guten Erklärungen, ist dann auch offensichtlich wieso hier

@echo off
setlocal EnableDelayedExpansion
set "^=Ein Dach"  
set "^^=Doch zwei"  
set "EinDach=^"  
call echo %%!EinDach!%%

Natürlich als Ausgabe "Doch zwei" rauskommt.

Grüße
jeb, der bastl-er
Member: Nagus
Nagus Jan 06, 2011 at 11:24:20 (UTC)
Goto Top
Okay, also
Zitat von @Biber:
> Zitat von @Nagus:
> ----
> Was passiert bei !Variable! ohne enabledelayedexpansion?
Was passiert denn, wenn du einen Busfahrschein in den ec-Kartenleser an der Supermarktkasse schiebst?
Oder wenn du versuchst einen Pudding zu toasten?

Weiß ich noch nicht - muss ich mal testen face-smile
Jaja - war ne blöde Frage, ich habe es inzwischen auch noch mal getestet ...

Nagus, der reumütige
Member: Nagus
Nagus Jan 06, 2011 at 11:40:28 (UTC)
Goto Top
Prima! Mission Accomplished!

Das verstehe ich jetzt nicht mehr ...

Nagus ?????