Como usar variáveis em variáveis? Este código:
set newvar=%var%var2%%
não funciona. Então o que fazer? Não consigo escrever meu programa sem ele.
Responder1
Eu concordo com AFH; você precisa fazer com que o CMD “analise duas vezes” a set
instrução. Mas descobri um truque para fazer isso que não envolve um arquivo em lote temporário (ou examinar cada variável para encontrar a que você deseja). Ele usa uma sub-rotina e um truque chamado expansão de variável atrasada. Habilite a expansão atrasada adicionando
setlocal enabledelayedexpansion
em algum lugar próximo ao início do seu arquivo em lote. O propósito da expansão atrasada de variáveis é um tanto complicado – veja SET /?
e SETLOCAL /?
para mais informações – mas o importante a saber é que ela permite referenciar variáveis com além de .!variable_name!
%variable_name%
Aqui vamos nos:
@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
Quando saltamos para :kludge
, a instrução é primeiro transformada em set newvar=!var2!
(porque %1
, o primeiro argumento da sub-rotina é var2
) e depois set newvar=orange
(como se a instrução tivesse sido set newvar=%var2%
). Então newvar
é definido como orange
.
Aliás, goto :eof
e exit /b
são intercambiáveis. Se chamados de dentro de uma sub-rotina (ou seja, de algum lugar onde você chegou com uma call
instrução), eles causam um retorno ao chamador. Caso contrário, eles agem como um salto para o final do arquivo em lote, fazendo com que o trabalho em lote seja encerrado sem destruir o prompt de comando pai e interativo.
Responder2
Um método relativamente lento. O comando CALL fornece um nível extra de expansão de variáveis. As porcentagens em torno do nome da variável externa são duplicadas para atrasar a expansão até que a variável interna tenha sido expandida.
@echo off
setlocal
set "var1=value"
set "var2=1"
call set "newvar=%%var%var2%%%"
Um método muito melhor é usar expansão retardada. Deve primeiro ser habilitado com SETLOCAL ENABLEDELAYEDEXPANSION. A variável dentro das porcentagens é expandida quando a linha é analisada. A variável dentro dos pontos de exclamação é expandida após a análise, pouco antes da linha ser executada.
@echo off
setlocal enableDelayedExpansion
set "var1=value"
set "var2=1"
set "newvar=!var%var2%!"
Responder3
Geralmente, eu tentaria evitar cenários como este. Embora seja possível, está longe de ter desempenho e também não é muito fácil de ler - basicamente, você teria que analisar a saída do set
comando.
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%