Ответ 1
Он не работает, потому что весь цикл 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%