Concordo com a AFH; você precisa obter o CMD para “analisar duas vezes” a instrução set
.
Mas eu encontrei um kludge para fazer isso que não envolve um arquivo de lote temporário
(ou olhando para cada variável para encontrar o que você quer).
Ele usa uma sub-rotina e um truque chamado expansão variável atrasada.
Ativar a expansão atrasada adicionando
setlocal enabledelayedexpansion
em algum lugar perto do início do seu arquivo de lote.
O objetivo da expansão de variável atrasada é um pouco complicado -
veja SET /?
e SETLOCAL /?
para mais informações -
mas o importante é saber que ele permite referenciar variáveis
com !variable_name!
além de %variable_name%
.
Então aqui vamos nó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
Quando saltamos para :kludge
, a instrução é primeiro transformada em set newvar=!var2!
(porque %1
, o primeiro argumento para a sub-rotina, é var2
)
e, em seguida, set newvar=orange
(como se a instrução tivesse sido set newvar=%var2%
).
Então, newvar
é definido como orange
.
BTW, goto :eof
e exit /b
são intercambiáveis.
Se chamado de dentro de uma sub-rotina (ou seja, em algum lugar que você chegou com uma declaração call
),
eles causam um retorno ao chamador.
Caso contrário, eles agem como um salto para o final do arquivo de lote, causando o trabalho em lote
para terminar sem explodir o prompt de comando pai, interativo.