![Batchdatei. Variable in Variable](https://rvso.com/image/1413962/Batchdatei.%20Variable%20in%20Variable.png)
Wie verwendet man Variablen in Variablen? Dieser Code:
set newvar=%var%var2%%
funktioniert nicht. Was soll ich also tun? Ich kann mein Programm nicht ohne es schreiben.
Antwort1
Ich stimme AFH zu; Sie müssen CMD dazu bringen, die Anweisung „doppelt zu analysieren“ set
. Aber ich habe einen Kludge dafür gefunden, der keine temporäre Batchdatei erfordert (oder das Durchsuchen aller Variablen, um die gewünschte zu finden). Er verwendet eine Subroutine und einen Trick namens verzögerte Variablenerweiterung. Aktivieren Sie die verzögerte Erweiterung, indem Sie hinzufügen
setlocal enabledelayedexpansion
irgendwo am Anfang Ihrer Batchdatei. Der Zweck der verzögerten Variablenerweiterung ist etwas kompliziert – weitere Informationen finden Sie unter SET /?
und SETLOCAL /?
–, aber wichtig zu wissen ist, dass Sie damit Variablen zusätzlich zu mit referenzieren können .!variable_name!
%variable_name%
Auf geht's:
@echo off
setlocal enabledelayedexpansion
set var1=red
set var2=orange
set var3=yellow
set A=2
call :kludge var%A%
echo Newvar is %newvar%.
goto :eof
:kludge
set newvar=!%1!
exit /b
Wenn wir zu springen :kludge
, wird die Anweisung zuerst in umgewandelt set newvar=!var2!
(weil %1
, das erste Argument der Subroutine, ist var2
) und dann set newvar=orange
(genauso, als ob die Anweisung gewesen wäre set newvar=%var2%
). newvar
Wird also auf gesetzt orange
.
Übrigens sind goto :eof
und exit /b
austauschbar. Wenn sie aus einer Subroutine heraus aufgerufen werden (also von einer Stelle, an die Sie mit einer call
Anweisung gelangt sind), führen sie zu einer Rückkehr zum Aufrufer. Andernfalls wirken sie wie ein Sprung an das Ende der Batchdatei, wodurch der Batchjob beendet wird, ohne die übergeordnete, interaktive Eingabeaufforderung zu löschen.
Antwort2
Eine relativ langsame Methode. Der CALL-Befehl bietet eine zusätzliche Ebene der Variablenerweiterung. Die Prozentzeichen um den äußeren Variablennamen werden verdoppelt, um die Erweiterung zu verzögern, bis die innere Variable erweitert wurde.
@echo off
setlocal
set "var1=value"
set "var2=1"
call set "newvar=%%var%var2%%%"
Eine viel bessere Methode ist die Verwendung der verzögerten Erweiterung. Sie muss zuerst mit SETLOCAL ENABLEDELAYEDEXPANSION aktiviert werden. Die Variable innerhalb der Prozente wird erweitert, wenn die Zeile analysiert wird. Die Variable innerhalb der Ausrufezeichen wird nach der Analyse erweitert, unmittelbar bevor die Zeile ausgeführt wird.
@echo off
setlocal enableDelayedExpansion
set "var1=value"
set "var2=1"
set "newvar=!var%var2%!"
Antwort3
Generell würde ich versuchen, solche Szenarien zu vermeiden. Es ist zwar möglich, aber es ist alles andere als leistungsfähig und auch nicht sehr einfach zu lesen – im Grunde müssten Sie die Ausgabe des set
Befehls analysieren.
set index=9
set var9=Goal
echo %var9%
for /F "usebackq tokens=1* delims==" %I in (`set`) do if "%I" == "var%index%" set result=%J
echo %result%