Подсчет в цикле FOR с использованием сценария Windows Batch

Кто-нибудь может это объяснить? Я могу подсчитывать в цикле, используя командную строку 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%
)
31
задан Ross Ridge 11 August 2016 в 01:51
поделиться

2 ответа

Это не работает, потому что весь цикл 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%
59
ответ дан 27 November 2019 в 21:49
поделиться

для a = от 1 до 100 шаг 1

Командная строка в Windows. Пожалуйста, используйте %% a, если выполняется в пакетном файле.

    for /L %a in (1,1,100) Do echo %a 
17
ответ дан 27 November 2019 в 21:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: