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

Variable aus mehreren Variablen zusammensetzen - in einer For Schleife

Frage Entwicklung Batch & Shell

Mitglied: Nagus

Nagus (Level 2) - Jetzt verbinden

05.01.2011 um 14:47 Uhr, 6948 Aufrufe, 9 Kommentare

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%

01.
set/A Var10=0 
02.
set/A Var12=1 
03.
set/A Var14=0 
04.
set/A Var24=0 
05.
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

01.
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
Mitglied: bastla
05.01.2011 um 15:09 Uhr
Hallo Verzweifelter !

Was Du vermutlich möchtest, ist:
01.
@echo off & setlocal enabledelayedexpansion 
02.
set/A Var10=0 
03.
set/A Var12=1 
04.
set/A Var14=0 
05.
set/A Var24=0 
06.
for /L %%i in (10,1,24) do if !Var%%i!==1 (echo Var%%i=Ja) else (echo Var%%i=Nein)
oder ev auch:
01.
@echo off & setlocal enabledelayedexpansion 
02.
set/A Var10=0 
03.
set/A Var12=1 
04.
set/A Var14=0 
05.
set/A Var24=0 
06.
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
Bitte warten ..
Mitglied: Nagus
05.01.2011 um 18:55 Uhr
Jippiiieeee!
Genau so funktioniert es! Deine Zweite Lösung ist sogar noch passender!

Aber jetzt möchte ich es auch noch verstehen:
01.
@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
Bitte warten ..
Mitglied: mathe172
05.01.2011 um 19:49 Uhr
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:
01.
@echo off 
02.
set /a "Var=0" 
03.
echo Ohne verzögerter Variablenexpansion: 
04.
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 
05.
for /L %%A in (1,1,10) do set /a Var=%Var%+1 
06.
echo %Var% 
07.
setlocal enabledelayedexpansion 
08.
set /a "Var=0" 
09.
echo Mit verzögerter Variablenexpansion: 
10.
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 
11.
REM Im 2. schaut er wieder den WErt von Var an:1 
12.
Nun rechnet er im 2. Durchgang: 1+1=2 
13.
for /L %%A in (1,1,10) do set /a Var=!Var!+1 
14.
REM Wichtig: Mit "!" einschliessen! 
15.
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:
01.
@echo off & setlocal enabledelayedexpansion 
02.
REM 20 Varaiblen mit Inhalt erzeugen: 
03.
For /L %%A in (1,1,20) do set "Var%%A=%%A" 
04.
:Loop 
05.
set /p "VarNr=Von der wievielten Variable willst du den Wert wissen? " 
06.
echo Ohne verzögerter Variablenexpansion: %Var%VarNr%% 
07.
echo Mit verzögerter Variablenexpansion: !Var%VarNr%! 
08.
pause>nul 
09.
cls 
10.
goto :Loop
]

Ich hoffe es ist verständlich
Mathe172
Bitte warten ..
Mitglied: Nagus
05.01.2011 um 20:30 Uhr
Hi Mathe172,
danke erstmal für die Ausführliche Erklärung!

Das mit dem @echo off ist klar 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
Bitte warten ..
Mitglied: Biber
05.01.2011 um 20:44 Uhr
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
Bitte warten ..
Mitglied: bastla
05.01.2011 um 20:48 Uhr
@mathe172

Und dann wäre da noch:
01.
set /a "Var=0" 
02.
for /L %%A in (1,1,10) do set /a Var+=1 
03.
echo %Var%
Grüße
bastla
Bitte warten ..
Mitglied: jeb-the-batcher
05.01.2011 um 22:36 Uhr
Dank der guten Erklärungen, ist dann auch offensichtlich wieso hier

01.
@echo off 
02.
setlocal EnableDelayedExpansion 
03.
set "^=Ein Dach" 
04.
set "^^=Doch zwei" 
05.
set "EinDach=^" 
06.
call echo %%!EinDach!%%
Natürlich als Ausgabe "Doch zwei" rauskommt.

Grüße
jeb, der bastl-er
Bitte warten ..
Mitglied: Nagus
06.01.2011 um 12:24 Uhr
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
Jaja - war ne blöde Frage, ich habe es inzwischen auch noch mal getestet ...

Nagus, der reumütige
Bitte warten ..
Mitglied: Nagus
06.01.2011 um 12:40 Uhr
Prima! Mission Accomplished!

Das verstehe ich jetzt nicht mehr ...

Nagus ?????
Bitte warten ..
Neuester Wissensbeitrag
Ähnliche Inhalte
Batch & Shell
gelöst While Schleife mit mehreren Arrays (2)

Frage von Markus2016 zum Thema Batch & Shell ...

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

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

LAN, WAN, Wireless
gelöst 1 Port in mehreren VLANs? (7)

Frage von mario87 zum Thema LAN, WAN, Wireless ...

Heiß diskutierte Inhalte
Windows Userverwaltung
Ausgeschiedene Mitarbeiter im Unternehmen - was tun mit den AD Konten? (33)

Frage von patz223 zum Thema Windows Userverwaltung ...

LAN, WAN, Wireless
FritzBox, zwei Server, verschiedene Netze (21)

Frage von DavidGl zum Thema LAN, WAN, Wireless ...

Viren und Trojaner
Aufgepasst: Neue Ransomware Goldeneye verbreitet sich rasant (20)

Link von Penny.Cilin zum Thema Viren und Trojaner ...

Windows Netzwerk
Windows 10 RDP geht nicht (18)

Frage von Fiasko zum Thema Windows Netzwerk ...