El Sanchez
Full Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Цитата: Из ее построения следует, что где-то одинарная кавычка стартовым/конечным символом являться может. Но мы выяснили, что вокруг параметров она не работает. Так где тогда? | GCRaistlin, на примере комстроки for /f "tokens=1,2 delims=;" %a in ("foo;bar;baz") do ... cmd должен разбить эту строку на токены, чтобы проверить правильность синтаксиса и дальнейшей передачи полученных подстрок дальше на разбор, если необходимо. Получится: токен for (имя команды), за ним следует токен /f (for в режиме разбора), за ним опциональный составной токен "tokens=1,2 delims=;" (настройки и тип разбора), %-переменная %a, ключевое слово in, открывающая скобка ( (сигнализирует, что следующий токен является целью разбора - файл, литерал или вывод команды), составной токен "foo;bar;baz", ключевое слово do, выражение. Как видите, это эквивалентно запуску программы for с переданными ей параметрами. Вы ведь знаете как программам параметры передаются, каким символом разделяются параметры и что делать, если параметр содержит символ-разделитель. Правильно, пробелом разделяются, а параметр, содержащий пробел (путь к файлу например), в двойные кавычки заключается, чтобы программа такой параметр не трактовала как несколько параметров, разделённых пробелом, а единым целым. Так вот составной токен "tokens=1,2 delims=;" содержит разделитель-пробел (в cmd разделителями также являются символы =, , и ;), поэтому в двойных кавычках. Дальше этот составной токен опять нужно разбить на составляющие, ключевые слова tokens, delims, eol и т.д., значения для них определить. Подпрограмма разбора данного составного токена получит на вход строку "tokens=1,2 delims=;", первый символ " - стартовый, он же конечный, т.е. разбор будет производиться до тех пор пока не будет встречен конечный символ. В коде подпрограммы предусмотрено поведение, когда стартовым символом может быть одинарная кавычка, видимо для случаев, когда внутри токена есть символ ", пример: 'tokens=1,3 delims=";'. В таком "tokens=1,2 delims=;" виде " в delims вы не добавите, экранируя ни так ^", ни сяк "", разбор просто встретит конечный символ и остановится, поэтому предусмотрен другой синтаксис. Но увы, что предусмотрено в подпрограмме, то в первоначальном разборе нет, ему подавай двойную. Выше предлагают без кавычек синтаксис, так тоже можно, подпрограмма разбор будет вести до конца составного токена, но для первоначального разбора выделенная часть for /f tokens=1,2 delims=; %a из-за разделителей будет разбита на несколько параметров, а не восприниматься как одно целое, поэтому и экранируют символом ^: tokens=1,2 delims=; - 5 токенов, после токена tokens, который воспримется как токен настройки и типа разбора, следует токен 1, который по синтаксису должен быть %-переменной, но т.к. это не так, то будет ошибка "Непредвиденное появление: 1" tokens^=1,2^ delims^=^; - 1 токен |