Как увеличить переменную 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.

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

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


person Mike    schedule 26.05.2010    source источник


Ответы (4)


Проблема с вашим фрагментом кода заключается в том, как расширяются переменные. Расширение переменной обычно выполняется при первом чтении оператора. В вашем случае читается весь цикл 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
person Frank Bollack    schedule 27.05.2010
comment
Супер-пупер! Это как раз то, что мне было нужно. Я соответствующим образом изменил сценарий, и теперь он работает так, как я ожидал. Спасибо за быстрый ответ. -- Майк - person Mike; 27.05.2010
comment
@Фрэнк Боллак. большое спасибо за это объяснение, я узнал что-то новое. Я использовал эту технику, чтобы ответить на другой вопрос: serverfault.com/questions/664202/ . Это работает, но я не уверен, как мне ссылаться на переменные вне цикла FOR. Имеет ли значение использование !c! или %c%, в этом IF у меня после FOR? - person pgr; 02.02.2015
comment
Я не понимаю, почему этот ответ находится внизу - он единственный, который работает, и включает объяснение того, почему это ключ! Спасибо! Это должен быть принятый ответ - person Thronk; 19.02.2015
comment
!c! была проблема - я не использовал его! вздох Спасибо! - person AndrewRalon; 20.07.2017

Я хотел бы добавить, что в случае, если вы создаете локальные переменные внутри цикла, их также необходимо расширить с помощью нотации 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
person curryage    schedule 23.07.2012

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

set /a "counter=0"

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

do (
   statement1
   statement2
   call :increaseby1
 )

:increaseby1
set /a "counter+=1"
person Carlo Ponsones    schedule 16.05.2013

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

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

:end
person Zonnevuur    schedule 18.11.2014