Arquivo em lote. Variável na variável

2

Como usar variáveis em variáveis? Este código:

set newvar=%var%var2%%

não funciona. Então o que fazer? Eu não posso escrever meu programa sem ele.

    
por user339962 30.06.2014 / 21:03

4 respostas

0

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.

    
por 03.07.2014 / 03:09
2

Um método relativamente lento. O comando CALL fornece um nível extra de expansão variável. As porcentagens em torno do nome da variável externa são duplicadas para atrasar a expansão até que a variável interna seja expandida.

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

Um método muito melhor é usar a expansão atrasada. Ele deve ser ativado primeiro com SETLOCAL ENABLEDELAYEDEXPANSION. A variável dentro de porcentagens é expandida quando a linha é analisada. A variável dentro dos pontos de exclamação é expandida após a análise, logo antes da linha ser executada.

@echo off
setlocal enableDelayedExpansion
set "var1=value"
set "var2=1"
set "newvar=!var%var2%!"
    
por 01.07.2014 / 16:09
1

Geralmente, eu tentaria evitar cenários como esse. Embora seja possível, está longe de ter desempenho e não é muito fácil de ler - basicamente você teria que analisar a saída do comando set .

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%
    
por 30.06.2014 / 21:18
0

Você está perdendo um%.

definir "newvar =% var1 %% var2%"

Observe que um var começa e termina com um%.

Veja também: link

    
por 30.06.2014 / 21:05

Tags