Как прирастить переменную 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.
Предложения приветствуются.
Спасибо, Майк
Ответы
Ответ 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