Показать полную графическую версию : [решено] Сложение переменной с числом в FOR
opravdin
04-06-2013, 18:15
Здравствуйте!
Имеется код:
set c=0
for /f "eol=# delims== tokens=1,2" %%i in (out.qrs) do (
set /a c=%c%+1
set com_%c%=%%i
set arg_%c%=%%j
)
Файл out.qrs содержит строки типа:
x=111
y=222
z=333
В результате требуются переменные com_"номер строки" и arg_"номер строки" (Т.е. в данном случае %com_2%=y, а %arg_1%=111)
Но при запуске команды к переменной c не прибавляется 1 и получается для каждой строки com_0 и arg_0. В чем соль?
opravdin, вот так:
@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
set c=0
for /f "eol=# delims== tokens=1,2" %%i in (out.qrs) do (
set /a c=!c!+1
set com_!c!=%%i
set arg_!c!=%%j
)
SET com_
SET arg_
PAUSE>nul
opravdin, Georgio:
set /a c = c + 1
«set /a» всегда раскрывает переменные окружения. «Отложенно», т.е. непосредственно в момент исполнения команды.
Указанную же команду вообще можно сократить до:
set /a c += 1
opravdin
04-06-2013, 19:57
Georgio, Iska, спасибо большое!
EnableDelayedExpansion уже был включен, напутал с % и !. Так же спасибо за упрощенную форму команды set
Указанную же команду вообще можно сократить до:
set /a c += 1 »
Так и есть, только уточню: вместо команд set c=0 и set /a c=c+1 применять только set /a c+=1.
set com_%c%=%%i
set arg_%c%=%%j »
А что здесь делать, если не SETLOCAL ENABLEDELAYEDEXPANSION?
kiripanda
04-06-2013, 20:52
call set com_%%c%%=%%i
call set arg_%%c%%=%%j
call set com_%%c%%=%%i
call set arg_%%c%%=%%j »
-- поясните.
Так и есть, только уточню: вместо команд … применять только »
Корректнее всё-таки предварительно обнулять переменную, в которой накапливается сумма:
set /a c = 0
дабы быть уверенным, что используемая переменная где-то ранее не получила числового значения.
поясните. »
Используется двойное раскрытие:
call set arg_%%c%%=%%j
Другие, напротив, говорят, что здесь «%» используется как экранирующий символ:
call set arg_%%c%%=%%j
Так или иначе, после вызова call в новый контекст на исполнение передаётся команда:
set arg_%c%=<значение переменной цикла разбора «i»>
kiripanda
04-06-2013, 21:31
поясните »
@ECHO OFF &SETLOCAL
set /a c=0
for /f "eol=# delims== tokens=1,2" %%i in (out.qrs) do (
set /a c=c+1
call set com_%%c%%=%%i
call set arg_%%c%%=%%j
)
SET com_
SET arg_
PAUSE
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.