Войти

Показать полную графическую версию : [решено] Сложение переменной с числом в 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. В чем соль?

Georgio
04-06-2013, 18:56
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

Iska
04-06-2013, 19:41
opravdin, Georgio:
set /a c = c + 1
«set /a» всегда раскрывает переменные окружения. «Отложенно», т.е. непосредственно в момент исполнения команды.

Указанную же команду вообще можно сократить до:
set /a c += 1

opravdin
04-06-2013, 19:57
Georgio, Iska, спасибо большое!
EnableDelayedExpansion уже был включен, напутал с % и !. Так же спасибо за упрощенную форму команды set

Georgio
04-06-2013, 20:18
Указанную же команду вообще можно сократить до:

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

Georgio
04-06-2013, 21:15
call set com_%%c%%=%%i
call set arg_%%c%%=%%j »

-- поясните.

Iska
04-06-2013, 21:27
Так и есть, только уточню: вместо команд … применять только »
Корректнее всё-таки предварительно обнулять переменную, в которой накапливается сумма:
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