Имя пользователя:
Пароль:
 

Показать сообщение отдельно


Moderator


Сообщения: 53589
Благодарности: 15546

Профиль | Отправить PM | Цитировать


Цитата ven00m:
Объясните мне ктонть почему не хочет работать проверка на "существования раздела" (4 и 5 строка, почемуто не хочет работать в теле цикла for)
Видимо, из-за раннего связывания. Для включения связывания времени выполнения надо вставить в начало файла команду SetLocal с параметром EnableDelayedExpansion:
Код: Выделить весь код
SetLocal EnableExtensions EnableDelayedExpansion
и использовать символы "!" вместо "%" при обращении к переменным. Почитать об этом можно, выполнив set /? в командной строке:
Код: Выделить весь код
Связывание времени выполнения для переменных среды окружения полезно при обходе
ограничений раннего связывания, которое происходит при первом чтении текстовой
строки, а не при ее выполнении. Следующий пример демонстрирует возникающую
проблему при использовании раннего связывания переменных:

    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%
Это сообщение посчитали полезным следующие участники:

Отправлено: 17:09, 11-01-2008 | #4