Arquivo em lote. Variável em variável

Arquivo em lote. Variável em variável

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 setinstruçã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 :eofe exit /bsão intercambiáveis. Se chamados de dentro de uma sub-rotina (ou seja, de algum lugar onde você chegou com uma callinstruçã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 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%

informação relacionada