Команда
FOR
превратилась в команду циклов в языке командных файлов. Если вы запросите справку по команде через FOR /?
- вы увидите множество способов, которыми эта команда была перегружена. К примеру, вы можете прочитать вывод команды, используя такую конструкцию:
FOR /F "tokens=*" %i IN ('ver') DO echo %iПереключатель
/F
вместе со строкой в апострофах указывает, что нужно запустить команду в апострофах, а её вывод нужно распарсить и возвратить в указанной переменной (или переменных). Опция "tokens=*"
говорит, что нужно брать всю строку. Есть несколько других опций, которые контролируют синтаксический разбор - но я оставляю их вам.Неуклюжий язык командных файлов стал ещё неуклюжее. Почему язык командных файлов имеет такой грамматический беспорядок?
Обратная совместимость.
Любое изменение языка командных файлов не должно повредить совместимости с миллионами написанных скриптов на командных файлах. Эти командные файлы записаны на миллионы CD-дисков (вы удивитесь, узнав, как много коммерческих программ используют командные файлы - особенно во время процесса установки). Они прилежно трудятся в миллионах корпораций по всему миру, выполняя ежедневные задания. Плюс, конечно же, командные файлы, написанные людьми вроде меня или вас, делают целую кучу вещей. Любое изменение в языке командных файлов должно быть таким, чтобы все эти файлы продолжали неизменно работать.
Конечно же, можно изобрести новый язык командных файлов - скажем Batch², и, таким образом, устранить необходимость в обратной совместимости. Но это решение встречает несколько препятствий.
Предположим, у вас есть командный файл на 500-строк, и вы хотите добавить в него небольшую возможность, но эта новая возможность доступна только в Batch². Означает ли это, что вам теперь надо полностью переписать ваш командный файл на язык Batch²? Ваша компания потратила годы на тонкую настройку этого файла (и под "настройкой" я иногда понимаю "превращение его в нечитаемую лапшу кода"). Вы примете под свою ответственность риски внесения бог-знает-скольких-багов и нарушения различных неявных особенностей во время полного переписывания файла на Batch²?
Предположим, вы решили рискнуть и переписать файл. Ой, но Batch² доступен только в последней версии Windows. Скажете ли вы: "Мы больше не поддерживаем старые версии Windows"? Или вы скажете: "Мы поддерживаем только те версии Windows, в которых есть Batch²"?
Я не говорю, что этого не произойдёт (вообще-то, мне кажется, что это уже происходит). Я просто объясняю, почему классический язык командных файлов такой неуклюжий. Добро пожаловать в эволюцию.
> Добро пожаловать в эволюцию.
ОтветитьУдалитьЯ, кстати, о том же думал. После чтения книг по эволюционной биологии я заметил, что исходные тексты программ, разрабатываемых без генерального плана, исключительно по принципу "решаем только сиюминутные задачи" становится очень похож на геном живого существа. По крайней мере там (в геноме) можно найти все виды известного говнокода. :) А недавно даже race condition нашли в считывании ДНК. :)
Раймонд лукавит, имхо. Что новое применение старой команды, что новая команда - никак не отразятся на старых скриптах. А обновлять командный процессор придется в обоих случаях (взять хотя бы режим "расширенной обработки", емнип, недоступный для Win98 либо доступный только с сервис-паком). Так на кой нагромождать все возможные применения на одну несчастную функцию?
ОтветитьУдалитьЕсли ты добавишь новую команду, то есть шанс, что она будет конфликтовать с именем существующей программы в каком-нибудь из базилионов командных файлов.
ОтветитьУдалитьВот в примере показан неуклюжий синтаксис команды FOR. Неуклюжий он по этой же причине - сделали так, чтобы новое расширение команды не пересеклось бы с уже написанными файлами.