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

Как прирастить переменную DOS в цикле FOR/F?

Я пытаюсь читать текстовые строки из файла и увеличивать счетчик, чтобы в конечном итоге смоделировать массив в 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.

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

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

4b9b3361

Ответ 1

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

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

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

Переменные, которые должны быть расширены с задержкой, ссылаются на !VARIABLE! вместо %VARIABLE%. Но вам нужно активировать эту функцию с помощью setlocal ENABLEDELAYEDEXPANSION и reset с соответствующим 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

Ответ 2

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

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

Или вы можете сделать это, не используя Delay.

set /a "counter=0"

- > ваш цикл for

do (
   statement1
   statement2
   call :increaseby1
 )

:increaseby1
set /a "counter+=1"

Ответ 4

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%
)

Ответ 5

Использование 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

Ответ 6

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

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

:end