пятница, 21 января 2011 г.

Чтение вывода командного файла

Это перевод Reading the output of a command from batch. Автор: Реймонд Чен.

Команда FOR превратилась в команду циклов в языке командных файлов. Если вы запросите справку по команде через FOR /? - вы увидите множество способов, которыми эта команда была перегружена. К примеру, вы можете прочитать вывод команды, используя такую конструкцию:
FOR /F "tokens=*" %i IN ('ver') DO echo %i
Переключатель /F вместе со строкой в апострофах указывает, что нужно запустить команду в апострофах, а её вывод нужно распарсить и возвратить в указанной переменной (или переменных). Опция "tokens=*" говорит, что нужно брать всю строку. Есть несколько других опций, которые контролируют синтаксический разбор - но я оставляю их вам.

Неуклюжий язык командных файлов стал ещё неуклюжее. Почему язык командных файлов имеет такой грамматический беспорядок?

Обратная совместимость.

Любое изменение языка командных файлов не должно повредить совместимости с миллионами написанных скриптов на командных файлах. Эти командные файлы записаны на миллионы CD-дисков (вы удивитесь, узнав, как много коммерческих программ используют командные файлы - особенно во время процесса установки). Они прилежно трудятся в миллионах корпораций по всему миру, выполняя ежедневные задания. Плюс, конечно же, командные файлы, написанные людьми вроде меня или вас, делают целую кучу вещей. Любое изменение в языке командных файлов должно быть таким, чтобы все эти файлы продолжали неизменно работать.

Конечно же, можно изобрести новый язык командных файлов - скажем Batch², и, таким образом, устранить необходимость в обратной совместимости. Но это решение встречает несколько препятствий.

Предположим, у вас есть командный файл на 500-строк, и вы хотите добавить в него небольшую возможность, но эта новая возможность доступна только в Batch². Означает ли это, что вам теперь надо полностью переписать ваш командный файл на язык Batch²? Ваша компания потратила годы на тонкую настройку этого файла (и под "настройкой" я иногда понимаю "превращение его в нечитаемую лапшу кода"). Вы примете под свою ответственность риски внесения бог-знает-скольких-багов и нарушения различных неявных особенностей во время полного переписывания файла на Batch²?

Предположим, вы решили рискнуть и переписать файл. Ой, но Batch² доступен только в последней версии Windows. Скажете ли вы: "Мы больше не поддерживаем старые версии Windows"? Или вы скажете: "Мы поддерживаем только те версии Windows, в которых есть Batch²"?

Я не говорю, что этого не произойдёт (вообще-то, мне кажется, что это уже происходит). Я просто объясняю, почему классический язык командных файлов такой неуклюжий. Добро пожаловать в эволюцию.

3 комментария:

  1. > Добро пожаловать в эволюцию.

    Я, кстати, о том же думал. После чтения книг по эволюционной биологии я заметил, что исходные тексты программ, разрабатываемых без генерального плана, исключительно по принципу "решаем только сиюминутные задачи" становится очень похож на геном живого существа. По крайней мере там (в геноме) можно найти все виды известного говнокода. :) А недавно даже race condition нашли в считывании ДНК. :)

    ОтветитьУдалить
  2. Раймонд лукавит, имхо. Что новое применение старой команды, что новая команда - никак не отразятся на старых скриптах. А обновлять командный процессор придется в обоих случаях (взять хотя бы режим "расширенной обработки", емнип, недоступный для Win98 либо доступный только с сервис-паком). Так на кой нагромождать все возможные применения на одну несчастную функцию?

    ОтветитьУдалить
  3. Если ты добавишь новую команду, то есть шанс, что она будет конфликтовать с именем существующей программы в каком-нибудь из базилионов командных файлов.

    Вот в примере показан неуклюжий синтаксис команды FOR. Неуклюжий он по этой же причине - сделали так, чтобы новое расширение команды не пересеклось бы с уже написанными файлами.

    ОтветитьУдалить

Можно использовать некоторые HTML-теги, например:

<b>Жирный</b>
<i>Курсив</i>
<a href="http://www.example.com/">Ссылка</a>

Вам необязательно регистрироваться для комментирования - для этого просто выберите из списка "Анонимный" (для анонимного комментария) или "Имя/URL" (для указания вашего имени и ссылки на сайт). Все прочие варианты потребуют от вас входа в вашу учётку (поддерживается OpenID).

Пожалуйста, по возможности используйте "Имя/URL" вместо "Анонимный". URL можно просто не указывать.

Ваше сообщение может быть помечено как спам спам-фильтром - не волнуйтесь, оно появится после проверки администратором.