Batchdatei. Variable in Variable

Batchdatei. Variable in Variable

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%). newvarWird also auf gesetzt orange.

Übrigens sind goto :eofund exit /baustauschbar. Wenn sie aus einer Subroutine heraus aufgerufen werden (also von einer Stelle, an die Sie mit einer callAnweisung 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 setBefehls 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%

verwandte Informationen