Сложение переменной с числом в FOR
Здравствуйте!
Имеется код:
Код:
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 содержит строки типа:
В результате требуются переменные 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» всегда раскрывает переменные окружения. «Отложенно», т.е. непосредственно в момент исполнения команды.
Указанную же команду вообще можно сократить до:
|
Georgio, Iska, спасибо большое!
EnableDelayedExpansion уже был включен, напутал с % и !. Так же спасибо за упрощенную форму команды set
|
Цитата:
Цитата Iska
Указанную же команду вообще можно сократить до:
»
|
Так и есть, только уточню: вместо команд и применять только .
Цитата:
Цитата opravdin
Код:
set com_%c%=%%i
set arg_%c%=%%j
»
|
А что здесь делать, если не
Код:
SETLOCAL ENABLEDELAYEDEXPANSION
?
|
Код:
call set com_%%c%%=%%i
call set arg_%%c%%=%%j
|
Цитата:
Цитата kiripanda
Код:
call set com_%%c%%=%%i
call set arg_%%c%%=%%j
»
|
-- поясните.
|
Цитата:
Цитата Georgio
Так и есть, только уточню: вместо команд … применять только »
|
Корректнее всё-таки предварительно обнулять переменную, в которой накапливается сумма:
дабы быть уверенным, что используемая переменная где-то ранее не получила числового значения.
Используется двойное раскрытие:
Код:
call set arg_%%c%%=%%j
Другие, напротив, говорят, что здесь «%» используется как экранирующий символ:
Код:
call set arg_%%c%%=%%j
Так или иначе, после вызова call в новый контекст на исполнение передаётся команда:
Код:
set arg_%c%=<значение переменной цикла разбора «i»>
|
Код:
@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
|
Время: 00:00.
© OSzone.net 2001-