Ошибка чтения значений из пакетного файла и их печати


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

Ответы:


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 . . .

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

  • Индекс A-Z командной строки Windows CMD - Отличный справочник по всем вопросам, связанным с Windows cmd line.
  • enabledelayedexpansion - Отложенное расширение приведет к тому, что переменные будут расширены во время выполнения, а не во время разбора.
  • SETLOCAL - Установите параметры для контроля видимости переменных среды в командном файле.

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.