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.