Подтвердить что ты не робот

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

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

Ответ 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%

Ответ 2

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

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

    for /L %a in (1,1,100) Do echo %a 

Ответ 3

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

@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