Smitis
Silver Member | Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору GCRaistlin Моя версия Командный файл выполняется блоками. Блок считывается построчно. После считывания очередной строки раскрываются переменные %% и проверяется синтаксис. Обычно блок состоит из одной строки, но в некоторых случаях блок может состоять из нескольких строк. Например, при использовании скобок (). В этом случае строки будут считываться (с раскрытием переменных и проверкой синтаксиса) до тех пор, пока все скобки не будут закрыты. Кроме того, в конце строки может стоять символ ^ экранирующий конец строки (сам символ ^ не должен быть экранирован другим символом ^), тогда считыватся следующая строка и присоединяется к текущей без раскрытия переменных и проверки синтаксиса. И так до тех пор, пока не считается строка без неэкранированного символа ^ в конце. После этого в итоговой склееной строке раскрываются переменные и проверяется синтаксис. Код: @echo off set e=0 setlocal enableextensions set "skobka1=( echo ****" set "skobka2=) & echo end cycle" for /l %%i in (1,1,11) do %skobka1% echo ^ ---- ^ %%i set e=%%i %skobka2% endlocal & echo end=%e% echo end=%e% | Переменные цикла - переменные времени выполнения. Поэтому требуется удваивание %%. CALL вызывает копию командного процессора со своей копией среды, при этом заново раскрываются переменные и проверяется синтакс. С символом ^ не всё так просто, есть нюансы. Добавлено: Цитата: Что для меня остается загадкой, так это то, почему работает следующая конструкция: Код: set a=b for %%A in (a) do call echo %%%%A%% | Ничего загадочного. На выполнение идёт for %A in (a) do call echo %%A% так как переменные уже раскрыты, то при выполнении for подставляется только %A со значением a, остальные знаки процента роли уже не играют, это обычные символы. Далее выполняется call echo %a% Новая копия процессора заново раскрывает переменные, проверяет синтаксис, выполняет, возвращает управление. Добавлено: Непонятки с кавычками из этой же серии - в момент выполнения кавычки уже не играют такую роль, как до выполнения - синтаксис уже проверен, текст на команды уже разбит. Добавлено: Вот ещё интересный пример Код: @echo off setlocal enabledelayedexpansion enableextensions set "command=echo qwerty & echo asdfgh" echo ---------------------------------------------- %command% echo ---------------------------------------------- !command! | В переменную записан код из двух команд. При раскрытии %command% обе команды выполнены (подстановка ДО выполнения) При раскрытии !command! символ & уже не интерпретируется, выполняется одна команда.
---------- Разум когда-нибудь победит |
| Всего записей: 3453 | Зарегистр. 09-02-2003 | Отправлено: 21:04 21-04-2016 | Исправлено: Smitis, 21:25 21-04-2016 |
|