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

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

DarkDream604 02-08-2012 18:15 1963619

Работа с переменными в цикле
 
PHP код:

@echo off
cd 
/d D:httpd
REM cmdow
.exe @ /HID
FOR /%%I In (0#,1#,7#) Do (
SET V hui
 SET V
=%%I
echo 
= %V= %%I%


выводит
PHP код:


1
2


5
6


если еще раз запустить то

PHP код:

7 I 0
7 I 1
7 I 2
7 I 3
7 I 4
7 I 5
7 I 6
7 I 

а надо
PHP код:

0 I 0
1 I 1
2 I 2
3 I 3
4 I 4
5 I 5
6 I 6
7 I 

что нет так?? я чего то не врубаюсь? и не подскажите как работать с переменными в цикле? почему где то в инете один процент, где то два , где то три? в интернете конкретной информации не нашел

sov44 02-08-2012 19:00 1963641

DarkDream604,
Код:

@echo off
SetLocal enabledelayedexpansion
FOR /L %%I In (0,1,7) Do (
SET V=%%I
echo V = !V! I = !V!
)
pause

Если переменная назначается внутри цикла, то знак % заменяется на знак !

Iska 02-08-2012 19:13 1963644

sov44, не совсем так. Переменные окружения, обрамлённые «%…%», раскрываются однократно при входе в скобки.

El Sanchez 02-08-2012 21:53 1963754

DarkDream604, переменная %V%, не является переменной цикла, поэтому ее раскрытие произойдет не во время выполнения тела цикла , а до него, и только один раз. Первый вывод на экран показывает, что при отработке тела цикла создается переменная %V%, но значение ее пусто, так как раскрытие уже произошло. Но при выполнении цикла переменная %V% меняет свое значение, по окончании которого оно равно 7. Это подтверждает второй вывод на экран, где опять же %V% раскрывается один раз. Чтобы переменная %V% раскрывалась во время выполнения цикла нужно включить режим отложенного раскрытия переменных, как это сделал sov44, написав строку SetLocal enabledelayedexpansion. В таком режиме символы процента для переменной, раскрытие которой нужно отложить, меняется на восклицательный знак. Режим можно и не включать, а использовать трюк с оператором CALL:
Код:

@Echo Off
SetLocal
FOR /L %%I In (0#,1#,7#) Do (
  Set V=%%I
  Call Echo:V=%%V%% I=%%I
)

Обратите внимание на выделенное красным. Я удвоил символы процента в имени переменной для того, чтобы раскрытие произошло 2 раза - первый раз интерпретатором перед выполнением, когда раскрывается все, что можно раскрыть (cимвол процента экранируется самим собою, поэтому при первом раскрытии от %%V%% останется только %V%), второй раз интерпретатором при выполнении команды CALL, которая на вход получит строку Echo:V=%V% I=тут уже будет какое-то значение.

TakTo 03-03-2015 16:08 2478260

Как работает отложенное раскрытие переменных для времени?
Код:

setlocal enabledelayedexpansion
for /f "usebackq delims=" %%i in (`time /t`) do set sTime=%%~i
pause ::пауза, чтобы создать разницу во времени
echo !sTime!

И все равно: конечное время - время присваивания переменной значения time /t, а не время снятия паузы. Я чего-то не понимаю... :idontnow:
Просто, чтобы уяснить.

Iska 03-03-2015 16:19 2478268

Не понимаете. Отложенное раскрытие, а не отложенное присвоение. Впрочем, в данном случае и отложенное раскрытие ни к чему.


Время: 12:57.

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