6

Я пытаюсь прочитать из файла и распечатать значения, но это не работает, переменная, кажется, установлена со значениями последнего запуска.

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

выход:

 1
 4
 2
 4
 3
 4
 4
 4 

Ожидаемый результат:

1
1
2
2
3
3
4
4

2 ответа2

8

Кажется, переменная установлена со значениями последнего запуска.

Это связано с тем, что cmd анализирует командный файл. По умолчанию переменные раскрываются во время разбора, а не во время выполнения. Это означает, что переменные в циклах оцениваются неправильно, если вы не включите отложенное расширение:

setlocal enabledelayedexpansion

Задержка расширения приведет к тому, что переменные будут расширяться во время выполнения, а не во время анализа, эта опция включается командой SETLOCAL .

Когда действует отложенное расширение, на переменные можно ссылаться с помощью !variable_name! (в дополнение к обычному %variable_name%)

Задержка расширения источника

Используйте следующий пакетный файл.

test.cmd:

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

Пример вывода:

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

Дальнейшее чтение

2

Вместо этого используйте метод CALL для подпрограммы, передающей значения цикла FOR из файла data.bat в эту подпрограмму в качестве аргумента для ECHO и т. Д .:

@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

Дополнительные ресурсы

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .