Archivo por lotes. variable en variable

Archivo por lotes. variable en variable

¿Cómo utilizar variables en variables? Este código:

set newvar=%var%var2%%

no funciona. ¿Entonces lo que hay que hacer? No puedo escribir mi programa sin él.

Respuesta1

Estoy de acuerdo con AFH; necesita hacer que CMD realice un "análisis doble" de la setdeclaración. Pero encontré una torpeza para hacerlo que no implica un archivo por lotes temporal (o mirar cada variable para encontrar la que desea). Utiliza una subrutina y un truco llamado expansión variable retardada. Habilite la expansión retrasada agregando

setlocal enabledelayedexpansion

en algún lugar cerca del comienzo de su archivo por lotes. El propósito de la expansión retardada de variables es algo complicado (consulte SET /?y SETLOCAL /?para obtener más información), pero lo importante es saber que le permite hacer referencia a variables además de .!variable_name!%variable_name%

Así que, aquí vamos:

@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

Cuando saltamos a :kludge, la declaración se transforma primero en set newvar=!var2! (porque  %1, el primer argumento de la subrutina es var2) y luego set newvar=orange(como si la declaración hubiera sido set newvar=%var2%). Así que newvarse pone a orange.

Por cierto, goto :eofy exit /bson intercambiables. Si se llama desde dentro de una subrutina (es decir, desde algún lugar al que se llega con una calldeclaración), provocan un retorno a la persona que llama. De lo contrario, actúan como un salto al final del archivo por lotes, lo que hace que el trabajo por lotes finalice sin eliminar el símbolo del sistema interactivo principal.

Respuesta2

Un método relativamente lento. El comando CALL proporciona un nivel adicional de expansión variable. Los porcentajes alrededor del nombre de la variable externa se duplican para retrasar la expansión hasta que se haya expandido la variable interna.

@echo off
setlocal
set "var1=value"
set "var2=1"
call set "newvar=%%var%var2%%%"

Un método mucho mejor es utilizar la expansión retardada. Primero debe habilitarse con SETLOCAL ENABLEDELAYEDEXPANSION. La variable dentro de porcentajes se expande cuando se analiza la línea. La variable dentro de los signos de exclamación se expande después del análisis, justo antes de ejecutar la línea.

@echo off
setlocal enableDelayedExpansion
set "var1=value"
set "var2=1"
set "newvar=!var%var2%!"

Respuesta3

Generalmente, intentaría evitar escenarios como este. Si bien es posible, está lejos de ser eficaz y tampoco es muy fácil de leer; básicamente, tendría que analizar la salida del setcomando.

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%

información relacionada