Это не работает, потому что цикл весь for
(от for
до заключительной закрывающей скобки, включая команды между ними) оценивается при его обнаружении, до начинает выполняться.
Другими словами, %count%
заменяется значением 1
перед запуском цикла.
Вам нужно что-то вроде:
setlocal enableextensions enabledelayedexpansion
set /a count = 1
for /f "tokens=*" %%a in (config.properties) do (
set /a count += 1
echo !count!
)
endlocal
Задержка расширения с использованием !
вместо %
даст вам ожидаемое поведение.См. Также здесь .
Также имейте в виду, что setlocal/endlocal
фактически ограничивает объем изменений внутри, чтобы они не просачивались.Если вы хотите использовать count
после endlocal
, вы должны использовать «трюк», возможный благодаря самой проблеме, с которой вы столкнулись:
endlocal && set count=%count%
Допустим,count
стало 7 внутри внутренней сферы.Поскольку вся команда интерпретируется перед выполнением, она фактически становится:
endlocal && set count=7
Затем, когда она выполнена , внутренняя область действия закрывается, возвращая count
в исходное значение.Но, поскольку установка count
на семь происходит во внешней области, это фактически приводит к утечке необходимой вам информации.
Вы можете объединить несколько подкоманд, чтобы получить столько информации, сколько вам нужно:
endlocal && set count=%count% && set something_else=%something_else%