Подсчет в цикле FOR с использованием пакетного скрипта Windows - PullRequest
29 голосов
/ 23 сентября 2011

Может кто-нибудь объяснить это? Я могу считать в цикле, используя командную строку 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%
)

Ответы [ 3 ]

54 голосов
/ 23 сентября 2011

Это не работает, потому что цикл весь 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%
15 голосов
/ 11 августа 2016

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

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

    for /L %a in (1,1,100) Do echo %a 
0 голосов
/ 03 июня 2019

Вот пакетный файл, который генерирует все адреса 10.x.x.x

@echo off

SET /A X=0
SET /A Y=0
SET /A Z=0

:loop
SET /A X+=1
echo 10.%X%.%Y%.%Z%
IF "%X%" == "256" (
 GOTO end
 ) ELSE (
 GOTO loop2
 GOTO loop
 )


:loop2
SET /A Y+=1
echo 10.%X%.%Y%.%Z%
IF "%Y%" == "256" (
  SET /A Y=0
  GOTO loop
  ) ELSE (
   GOTO loop3
   GOTO loop2
 )


:loop3

SET /A Z+=1
echo 10.%X%.%Y%.%Z%
IF "%Z%" == "255" (
  SET /A Z=0
  GOTO loop2
 ) ELSE (
   GOTO loop3
 )

:end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...