Показать полную графическую версию : Работа с переменными в цикле
DarkDream604
02-08-2012, 18:15
@echo off
cd /d D:\httpd\
REM cmdow.exe @ /HID
FOR /L %%I In (0#,1#,7#) Do (
SET V = hui
SET V=%%I%
echo V = %V% I = %%I%
)
выводит
V = I = 0
V = I = 1
V = I = 2
V = I = 3
V = I = 4
V = I = 5
V = I = 6
V = I = 7
если еще раз запустить то
V = 7 I = 0
V = 7 I = 1
V = 7 I = 2
V = 7 I = 3
V = 7 I = 4
V = 7 I = 5
V = 7 I = 6
V = 7 I = 7
а надо
V = 0 I = 0
V = 1 I = 1
V = 2 I = 2
V = 3 I = 3
V = 4 I = 4
V = 5 I = 5
V = 6 I = 6
V = 7 I = 7
что нет так?? я чего то не врубаюсь? и не подскажите как работать с переменными в цикле? почему где то в инете один процент, где то два , где то три? в интернете конкретной информации не нашел
DarkDream604, @echo off
SetLocal enabledelayedexpansion
FOR /L %%I In (0,1,7) Do (
SET V=%%I
echo V = !V! I = !V!
)
pause
Если переменная назначается внутри цикла, то знак % заменяется на знак !
sov44, не совсем так. Переменные окружения, обрамлённые «%…%», раскрываются однократно при входе в скобки.
El Sanchez
02-08-2012, 21:53
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=тут уже будет какое-то значение.
Как работает отложенное раскрытие переменных для времени?
setlocal enabledelayedexpansion
for /f "usebackq delims=" %%i in (`time /t`) do set sTime=%%~i
pause ::пауза, чтобы создать разницу во времени
echo !sTime!
И все равно: конечное время - время присваивания переменной значения time /t, а не время снятия паузы. Я чего-то не понимаю... :idontnow:
Просто, чтобы уяснить.
Не понимаете. Отложенное раскрытие, а не отложенное присвоение. Впрочем, в данном случае и отложенное раскрытие ни к чему.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.