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

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Microsoft Windows NT/2000/2003 (http://forum.oszone.net/forumdisplay.php?f=5)
-   -   Объясните, что может выполнять эта часть кода (http://forum.oszone.net/showthread.php?t=90790)

skeletor 24-09-2007 11:21 648421

Объясните, что может выполнять эта часть кода
 
Пытался почитать в мануалах, но так ничего и не понял. Понял только в общих чертах и то- частично :
- первая строка проверяет правильность параметра, и все ошибки то напрявляет их в "дыру"
- вторая строка вообще меня приводит в непонятку.
- третья : идёт проверка, если установилось не "enabledelayedexpansion", то писать ошибку в %dvderr%.
Код:

VERIFY parametr 2>nul
setlocal enabledelayedexpansion
IF ERRORLEVEL 1  (echo %date:~-10% cannot turn on delayedexpansion, run "cmd /v:on" first>>%dvderr% ) & goto :eof

Разъясните пожалуйста.

ОС windows 2000.

Petya V4sechkin 24-09-2007 11:48 648441

Яндекс

skeletor 24-09-2007 12:11 648458

Это всё хорошо, прочёл на русском про комманду enabledelayedexpansion.

А можно на пальцах объяснить, что оно такое и с чем его едят? Ибо прочтя статью, ты понимаешь, "что параметр enabledelayedexpansion используется до тех пор, пока не встретится endlocal".

Да и и пример приведёный в тексте - ничего не объясняет, просто делает проверку удачно ли установился enabledelayedexpansion или нет.

Либо я туплю, либо там так написано. :(

Petya V4sechkin 24-09-2007 12:15 648459

Пуск -> Выполнить -> Cmd
Код:

setlocal /?
set /?

Код:

Наконец, добавлена поддержка связывания времени выполнения для переменных среды
окружения. По умолчанию эта поддержка отключена. Ключ /V командной строки
CMD.EXE позволяет включать и выключать ее. Для вызова справки, наберите CMD /?

Связывание времени выполнения для переменных среды окружения полезно при обходе
ограничений раннего связывания, которое происходит при первом чтении текстовой
строки, а не при ее выполнении. Следующий пример демонстрирует возникающую
проблему при использовании раннего связывания переменных:

    set VAR=before
    if "%VAR%" == "before" (
        set VAR=after
        if "%VAR%" == "after" @echo Тело внутреннего оператора сравнения
    )

Данное сообщение не будет выводиться, т.к. %VAR% в ОБОИХ выражениях IF
подставляется в момент первого использования в первом IF, в том числе и в тело
первого ветвления IF, которое является составным выражением. В IF внутри
составного выражения в действительности сравниваются значения "before" и
"after", что заведомо ложно. Следующий пример демонстрирует подобную ошибку:

    set LIST=
    for %i in (*) do set LIST=%LIST% %i
    echo %LIST%

в данном случае список файлов текущей папки никогда не будет построен. Вместо
этого, значением переменной LIST будет имя последнего найденного файла.
И вновь, это случилось потому, что %LIST% подставляется всего один раз -
в момент обработки выражения FOR, когда список еще пуст.
Фактически, приведенный фрагмент эквивалентен следующему примеру:

    for %i in (*) do set LIST= %i

в котором имя последнего найденного файла сохраняется в переменной LIST.

Связывание времени выполнения для переменных среды окружения происходит при
использовании специального символа (восклицательного знака), обозначающего
проведение сопоставления во время выполнения. Если включена поддержка связывания
времени выполнения, то для достижения ожидаемых результатов приведенные выше
фрагменты должны быть изменены следующим образом:

    set VAR=before
    if "%VAR%" == "before" (
        set VAR=after
        if "!VAR!" == "after" @echo Тело внутреннего оператора сравнения
    )

    set LIST=
    for %i in (*) do set LIST=!LIST! %i
    echo %LIST%


skeletor 24-09-2007 12:38 648480

Да мне ясно что выполняет комманда setlocal. Мне неясно что выполняет setlocal enabledelayedexpansion :(
Если несложно - объясните на пальцах.

Petya V4sechkin 24-09-2007 12:49 648488

skeletor, почитайте предыдущий пост со слов "Наконец, добавлена поддержка связывания времени выполнения". Это оно и есть, EnableDelayedExpansion.
Если попытаюсь на пальцах объяснять, выйдет хуже (менее понятно).

skeletor 27-09-2007 10:47 650335

Спасибо всем, кто помогал. Для таких как я - на пальцах расписано :)
Код:

В обычном случае, чтобы узнать значение переменной окружения, надо
воспользоваться конструкцией %переменная%.
Однако, если значение переменной меняется внутри цикла
и читается там же, то для корректной работы батника, нужно
использовать команду setlocal enabledelayedexpansion и вместо
символа "%", использовать символ "!". Иначе, значение
переменной в цикле будет всегда одним и тем же - таким, каким было до входа в цикл.



Время: 00:31.

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