burningstep
Goto Top

Kann aus Bausteinen eine bereits vorhandene Variable abgefragt werden?

Hallihallo

Als Nicht-Entwickler durfte ich von dieser Seite bereits sehr viel von eurem KnowHow profitieren; an dieser Stelle ein herzliches Dankeschön.

Aktuell bemühe ich mich um die Frage, ob aus vorhandenen Bausteinen/Werten eine bereits definierte Variable abgefragt werden kann. Bisher kriege ich es nicht hin, kann sein das es auch gar nicht funktioniert.

Zur Veranschaulichung nachfolgender Aufbau, in welcher zuerst die Variablen Ist1, Ist2 und Ist3 definiert werden, diese dann je nach Verlauf des Programms beim Binding abgefragt werden sollen.

Der Ausdruck %Ist%Number%% soll zusammen gebaut entweder Ist1, Ist2 oder Ist3 ergeben und beim echo sollte dann entsprechend one, two und three ausgegeben werden, das will mir aber partout nicht gelingen. Ich krieg das nicht richtig zusammen gebaut hin.
@echo off

set Ist1=one
set Ist2=two
set Ist3=three

set List=1 2 3

for %%a in (%List%) do (
	set Number=%%a
	call :Binding
)

pause >nul
exit

:Binding
echo %Ist%Number%%
exit /b

Gefühlt habe ich das in hunderte Varianten versucht, scheitere jedoch kläglich.
Gibt es eine Möglichkeit, das Gewünschte zu erreichen?

Liebe Grüsse aus der Schweiz
burningstep

Content-ID: 250989

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

Ausgedruckt am: 25.11.2024 um 09:11 Uhr

Friemler
Lösung Friemler 05.10.2014 aktualisiert um 14:17:25 Uhr
Goto Top
Hallo burningstep,

das sollte so gehen:
@echo off & setlocal

set Ist1=one
set Ist2=two
set Ist3=three

set List=1 2 3

for %%a in (%List%) do (
  set "Number=%%a"  
  call :Binding
)

pause > NUL
exit /b


:Binding
  call echo %%Ist%Number%%%
exit /b

Die Variable %Number% ist aber nicht unbedingt notwendig, man kann den Wert auch als Argument an das Unterprogramm Binding übergeben und das Beispiel folgendermaßen schreiben:
@echo off & setlocal

set Ist1=one
set Ist2=two
set Ist3=three

set List=1 2 3

for %%a in (%List%) do (
  call :Binding "%%a"  
)

pause > NUL
exit /b


:Binding
  call echo %%Ist%~1%%
exit /b

Das entscheidende bei beiden Varianten ist, dass man einen CALL-Befehl vor das ECHO schreibt und die Prozentzeichen verdoppelt, die im Unterprogramm Binding den dynamisch erzeugten Variablennamen umschließen. Dadurch wird der Batchscript-Interpreter dazu gezwungen, die Zeile zweimal zu parsen/auszuwerten.

1. Auswertung
Die Variable %Number% bzw. %1 (die Tilde ~ in %~1 entfernt umgebende Anführungszeichen) wird durch ihren Wert ersetzt und die umschließenden doppelten %-Zeichen werden auf jeweils ein Zeichen reduziert. => Beim ersten Schleifendurchlauf ergibt sich folgende Befehlszeile:
call echo %Ist1%

2. Auswertung
Weil die Befehlszeile den CALL-Befehl enthält, wird sie erneut ausgewertet und dabei festgestellt, dass die Variable %Ist1% durch ihren Wert ersetzt werden muss. Danach wird der CALL-Befehl ausgeführt. Erstes Argument ist das auszuführende Programm bzw. der auszuführende interne Befehl, hier ECHO. Weitere Argumente, hier der Wert von %Ist1%, werden dem auszuführenden Programm bzw. dem auszuführenden internen Befehl als Argumente übergeben. => Es ergibt sich die Befehlszeile
echo one

Gruß
Friemler
burningstep
burningstep 05.10.2014 aktualisiert um 14:28:32 Uhr
Goto Top
Hallo Friemler

Vielen lieben Dank für deine Antwort und super Erklärung.
Der call vor dem echo ist für mich neu. Aber ich glaub, ich habe verstanden face-smile

Grüsse
burningstep