Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Сложение переменной с числом в FOR (http://forum.oszone.net/showthread.php?t=261852)

opravdin 04-06-2013 18:15 2162188

Сложение переменной с числом в 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 содержит строки типа:
Код:

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 2162209

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 2162239

opravdin, Georgio:
Код:

        set /a c = c + 1
«set /a» всегда раскрывает переменные окружения. «Отложенно», т.е. непосредственно в момент исполнения команды.

Указанную же команду вообще можно сократить до:
Код:

        set /a c += 1

opravdin 04-06-2013 19:57 2162251

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

Georgio 04-06-2013 20:18 2162264

Цитата:

Цитата Iska
Указанную же команду вообще можно сократить до:

Код:

set /a c += 1
»

Так и есть, только уточню: вместо команд
Код:

set c=0
и
Код:

set /a c=c+1
применять только
Код:

set /a c+=1
.


Цитата:

Цитата opravdin
Код:

set com_%c%=%%i
set arg_%c%=%%j

»

А что здесь делать, если не
Код:

SETLOCAL ENABLEDELAYEDEXPANSION
?

kiripanda 04-06-2013 20:52 2162297

Код:

        call set com_%%c%%=%%i
        call set arg_%%c%%=%%j


Georgio 04-06-2013 21:15 2162309

Цитата:

Цитата kiripanda
Код:

call set com_%%c%%=%%i
call set arg_%%c%%=%%j

»

-- поясните.

Iska 04-06-2013 21:27 2162323

Цитата:

Цитата Georgio
Так и есть, только уточню: вместо команд … применять только »

Корректнее всё-таки предварительно обнулять переменную, в которой накапливается сумма:
Код:

set /a c = 0
дабы быть уверенным, что используемая переменная где-то ранее не получила числового значения.


Цитата:

Цитата Georgio
поясните. »

Используется двойное раскрытие:
Код:

call set arg_%%c%%=%%j
Другие, напротив, говорят, что здесь «%» используется как экранирующий символ:
Код:

call set arg_%%c%%=%%j
Так или иначе, после вызова call в новый контекст на исполнение передаётся команда:
Код:

set arg_%c%=<значение переменной цикла разбора «i»>

kiripanda 04-06-2013 21:31 2162331

Цитата:

Цитата Georgio
поясните »

Код:

@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.

Время: 00:00.
© OSzone.net 2001-