Кто-нибудь может это объяснить? Я могу подсчитывать в цикле, используя командную строку Windows, используя этот метод:
SET /A XCOUNT=0
:loop
SET /A XCOUNT+=1
echo %XCOUNT%
IF "%XCOUNT%" == "4" (
GOTO end
) ELSE (
GOTO loop
)
:end
Но этот метод не работает (он выводит «1» для каждой строки в файле). Он действует так, как будто переменная вне области видимости:
SET /A COUNT=1
FOR /F "tokens=*" %%A IN (config.properties) DO (
SET /A COUNT+=1
ECHO %COUNT%
)
Это не работает, потому что весь цикл 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%
для a = от 1 до 100 шаг 1
Командная строка в Windows. Пожалуйста, используйте %% a, если выполняется в пакетном файле.
for /L %a in (1,1,100) Do echo %a