Erro ao ler valores de um arquivo em lote e imprimi-los

6

Estou tentando ler de um arquivo e imprimir os valores, mas não funciona, a variável parece estar definida com valores da última execução.

read.bat:

@echo off
for /f "tokens=*" %%a in (data.bat) do (
echo %%a
set server=%%a
echo %server%
)
pause

data.bat:

 1
 2
 3
 4

saída:

 1
 4
 2
 4
 3
 4
 4
 4 

Resultado esperado:

1
1
2
2
3
3
4
4
    
por utkarsh tyagi 03.08.2016 / 08:21

2 respostas

8

A variável parece estar definida com valores da última execução.

Isso se deve à maneira como cmd analisa um arquivo em lotes. Por padrão, as variáveis são expandidas no tempo de análise não no tempo de execução. Isso significa que a variável em loops é avaliada incorretamente, a menos que você ative a Expansão com atraso :

setlocal enabledelayedexpansion

Delayed Expansion will cause variables to be expanded at execution time rather than at parse time, this option is turned on with the SETLOCAL command.

When delayed expansion is in effect variables can be referenced using !variable_name! (in addition to the normal %variable_name%)

Fonte Expansão atrasada

Use o seguinte arquivo em lotes.

test.cmd:

@echo off
setlocal enabledelayedexpansion
for /f "tokens=*" %%a in (data.bat) do (
echo %%a
set server=%%a
echo !server!
)
pause
endlocal

Exemplo de saída:

F:\test>test
1
1
2
2
3
3
4
4
Press any key to continue . . .

Leitura Adicional

por 03.08.2016 / 10:00
2

Dê uma chance a isso usando uma CHAMADA para uma sub-rotina passando os valores do loop FOR do arquivo data.bat para aquela rotina como um argumento para ECHO, etc.:

@echo off
for /f "tokens=*" %%a in (data.bat) do (
CALL :Routine "%%~a"

)
PAUSE
GOTO EOF

:Routine
echo %~1
set server=%~1
echo %server%
GOTO EOF

Mais recursos

por 03.08.2016 / 09:10