Как увеличить переменную DOS в цикле FOR / F? - PullRequest
45 голосов
/ 26 мая 2010

Я пытаюсь прочитать строки текста из файла и увеличить счетчик, чтобы я мог в конечном итоге смоделировать массив в DOS.

Я хотел бы иметь возможность хранить строки текста вМассив DOS для дальнейшей обработки.

Моя текущая попытка:

set TEXT_T="myfile.txt"

set /a c=1

FOR /F "tokens=1 usebackq" %%i in (%TEXT_T%) do (
set /a c=c+1
echo %%i,  %c%
)

Но переменная c не увеличивается;* 1

Предложения приветствуются.

Спасибо, Майк

Ответы [ 6 ]

79 голосов
/ 27 мая 2010

Проблема с вашим фрагментом кода заключается в способе раскрытия переменных. Расширение переменной обычно выполняется при первом чтении оператора. В вашем случае весь цикл FOR и его блок считываются, а все переменные, кроме переменных цикла, расширяются до их текущего значения.

Это означает, что %c% в вашем echo %%i, %c% мгновенно расширяется и поэтому фактически используется как echo %%i, 1 в каждой итерации цикла.

Так что вам нужно, это расширение отложенной переменной. Найдите хорошее объяснение по этому поводу здесь .

Переменные, которые должны быть расширены с задержкой, обозначаются !VARIABLE! вместо %VARIABLE%. Но вам нужно активировать эту функцию с помощью setlocal ENABLEDELAYEDEXPANSION и сбросить ее с соответствующим endlocal.

Ваш модифицированный код будет выглядеть примерно так:

set TEXT_T="myfile.txt"

set /a c=1

setlocal ENABLEDELAYEDEXPANSION

FOR /F "tokens=1 usebackq" %%i in (%TEXT_T%) do (
  set /a c=c+1

  echo %%i, !c!
)

endlocal
4 голосов
/ 23 июля 2012

Я хотел бы добавить, что в случае, если вы создаете локальные переменные в цикле, их также необходимо расширять, используя обозначение bang (!). Расширяя пример на https://stackoverflow.com/a/2919699 выше, если мы хотим создать основанные на счетчике выходные имена файлов

set TEXT_T="myfile.txt"

set /a c=1

setlocal ENABLEDELAYEDEXPANSION

FOR /F "tokens=1 usebackq" %%i in (%TEXT_T%) do (
    set /a c=c+1
    set OUTPUT_FILE_NAME=output_!c!.txt
    echo Output file is !OUTPUT_FILE_NAME!
    echo %%i, !c!
)

endlocal
3 голосов
/ 16 мая 2013

Или вы можете сделать это без использования задержки.

set /a "counter=0"

-> ваш цикл здесь

do (
   statement1
   statement2
   call :increaseby1
 )

:increaseby1
set /a "counter+=1"
0 голосов
/ 18 ноября 2014

А как насчет этого простого кода, работает у меня и в Windows 7

set cntr=1
:begin
echo %cntr%
set /a cntr=%cntr%+1
if %cntr% EQU 1000 goto end
goto begin

:end
0 голосов
/ 25 марта 2014

Использование Windows 7. Не могу заставить EnableDelayedExpansion делать свое дело. У меня есть два тестовых файла с именами Test1.tst и Test2.tst. Я хочу сделать что-то только с первым. Два места, где я! не разрешается до значения. Последний echo печатает ноль. Вот мой код:

set /a count1=0

setlocal EnableDelayedExpansion
for %%x in (*.tst) do (

  if !count1! GTR 0 goto :getout

  call :addit

  type %%x

  ren %%x *.xxx

)
@echo Almost done...
goto :alldone

:addit
set /a count1=%count1% + 1
@echo %count1%
goto :eof

:getout
@echo Getting out...
@echo !count!

:alldone
endlocal
0 голосов
/ 13 января 2014
set TEXT_T="myfile.txt"
set /a c=1

FOR /F "tokens=1 usebackq" %%i in (%TEXT_T%) do (
    set /a c+=1
    set OUTPUT_FILE_NAME=output_%c%.txt
    echo Output file is %OUTPUT_FILE_NAME%
    echo %%i, %c%
)
...