Сценарии загрузки файлов по протоколу HTTP
Время от времени я обнаруживаю в Internet то одну, то другую полезную утилиту. Поработав с ней некоторое время, я начинаю искать самую новую версию программы. Однако не всегда есть возможность регулярно посещать соответствующие Web-узлы в поисках новых версий. Я часто пользуюсь автономным инструментом поиска вирусов Stinger компании McAfee. Единственный недостаток этого инструмента заключается в том, что компания редко обновляет Stinger и невозможно предугадать, когда появится новая версия.
Очевидно, частота обновления Stinger зависит от числа новых вирусов. Я использовал сайт WatchThatPage (http://www.watchthatpage.com) для мониторинга изменений Web-страницы, но мне был нужен более удобный способ получать информацию о новых версиях файла и, кроме того, хотелось, чтобы новейшая версия автоматически доставлялась по почте. Так появился сценарий HTTPDownLoader.bat (см. листинг 1). Данный сценарий был составлен в первую очередь для утилиты Stinger, но не составит труда настроить его на поиск новых версий и загрузку любого файла, доступного через протокол HTTP.
Для загрузки и сравнения версий и размеров файлов Stinger в сценарии используются еще две утилиты. Кроме того, применяется старая проверенная утилита Blat для пересылки почтовых сообщений с присоединенными файлами.
Загрузка файлов с использованием HTTPИз командной оболочки можно загружать файлы через протокол FTP, но внутренние команды и инструменты набора ресурсов не обеспечивают их загрузки по протоколу HTTP. Я просмотрел множество инструментов независимых поставщиков, которые можно найти в Internet, и выбрал один, который мог бы пригодиться всем. Список инструментов командной оболочки от независимых поставщиков приведен во врезке «Инструменты для командной оболочки». Для загрузки файла Stinger я использовал программу iOpus File Downloader. Она имеет графический интерфейс, но поддерживает и работу с командной строки; запускать ее можно без участия пользователя. Для загрузки файлов используется следующий синтаксис:
downloader.exe -download source destination
где source указывает путь к файлу, который нужно загрузить, а destination — каталог, в который следует скопировать файл. Например, команда для Stinger выглядит следующим образом:
В выбранной мною текущей версии iOpus File Downloader каталог назначения должен находиться на локальной машине. Если используется путь в нотации Universal Naming Convention (UNC), то результаты копирования могут оказаться самые неожиданные. Я сообщил об этом недостатке в компанию iOpus, и в следующей версии ошибка должна быть исправлена. А пока следует использовать локальный путь (например, D:stinger.exe), а затем при необходимости копировать файл в удаленный каталог. В файле HTTPDownLoader.bat такое ограничение не вызывает затруднений.
Сравнение версийРасполагая инструментом для загрузки файла из Web, необходимо определить, отличается ли загруженная версия от прежней, которая имеется у пользователя. Для сравнения версий файлов я использовал утилиту Filever из пакета Windows 2000 Support Tools, с помощью которой можно сравнивать структуры папок и отдельные файлы. Сценарий HTTPDownLoader.bat загружает текущую версию с Web-узла, затем запускает Filever, чтобы сравнить новую программу с имеющимися экземплярами. Если номер версии или число байтов изменилось, то сценарий посылает по электронной почте сообщение об изменении файла и — если получатель запросит файл — пересылает новую версию в качестве вложения.
Используемая в сценарии базовая команда Filever выглядит следующим образом:
filever.exe /A D:stinger.exe
В этой команде ключ /A указывает, что утилита не должна выводить на экран атрибуты файла. Как видно из фрагмента исходного текста в листинге 2, для извлечения информации о номере версии и числе байтов в сценарии используется команда For. Я просто объединил информацию о версии (token 4) и размере (token 6). Может возникнуть вопрос, зачем вместе с номером версии проверять и число байтов? Во-первых, разработчик мог изменить содержимое файла, но не номер версии. Во-вторых, встречаются файлы без номера версии, и не исключено, что может измениться номер версии, но не размер файла. Функция сравнения показана под меткой A в листинге 2. Предполагается, что если файл на сайте-источнике изменился, то он представляет собой новую версию.
Полезный совет для запуска утилит из команды For: Filever и некоторые другие утилиты могут работать нестабильно, если их путь внутри команды For заключен в двойные кавычки. Вместо двойных кавычек — типичный прием для работы с пробелами — необходимо найти путь к утилите, не содержащий пробелов. К сожалению, многие инструменты, в том числе большинство утилит Microsoft, по умолчанию хранятся в каталогах, путь к которым содержит пробелы. Случается даже, что утилита прекрасно работает внутри команды For, пока путь к ней не заключен в двойные кавычки, но затем пользователь начинает получать сообщения об ошибках, например, The filename, directory name, or volume label syntax is incorrect («Синтаксическая ошибка в имени файла, имени каталога или метке тома»). Рекомендуется всегда устанавливать инструменты Support Tools и любые другие утилиты в каталоге, в пути к которому нет пробелов (чтобы не приходилось преобразовывать все пути в формат 8.3).
Особенности почтовых сообщенийДля пересылки почтовых вложений используется простая и гибкая утилита Blat. Во время подготовки данной статьи Blat была представлена версией 1.9.4, но данный сценарий успешно работает и с предыдущими версиями. Однако необходимо помнить о некоторых особенностях утилиты Blat. Одна из них заключается в том, что если обратиться к оперативной подсказке с помощью команды
blat /? или blat /help
из командного окна, то будет выдано сообщение об ошибке. Поэтому, чтобы увидеть подробный список параметров, следует ввести в командном окне
Число параметров Blat поражает. Однако в HTTPDownLoader.bat используются лишь некоторые из них. Если бы применяемая в сценарии команда Blat вводилась в командном окне, она имела бы следующий вид:
Этот аргумент команды задает путь к текстовому файлу, который содержит тело почтового сообщения. Ключ attach указывает на присоединяемый файл, ключ s задает строку «Тема», ключ server — адрес почтового сервера SMTP, ключ f определяет адрес электронной почты отправителя сообщения, а ключ t — почтовый адрес получателя. Во фрагменте A листинга 3 показано, как выглядит команда Blat при использовании переменных вместо жестко заданных аргументов и ключей. Исходный текст фрагмента A посылает почтовое сообщение о новой версии утилиты и присоединяет эту новую версию. Команда Blat, предшествующая метке A, посылает только почтовое сообщение.
Вторая особенность, очевидная в предыдущей команде, — необходимость хранить текст сообщения в текстовом файле. Даже если сообщение очень короткое, его невозможно ввести в качестве аргумента; необходимо поместить сообщение в текстовый файл, который Blat использует в качестве источника сообщения.