четверг, 10 марта 2011 г.

Секреты %SystemRoot%\System32: BITSAdmin

CLIЕще один мой старый устаревший друг. Но хоть и устаревший, а старый друг, лучше новых. В первую очередь он лучше потому, что я все еще не нашел времени хорошо ознакомиться со всякими там PoSh-командлетами вида *-BITSTransfer. Во-вторых… Да нет никаких “во-вторых”, как обычно =) Тем не менее команда совершенно великолепная, и я хотел бы сделать ей посвящение этой стьей. Хотя обычно я ее использовал просто чтобы быть уверенным, что нужный мне файл скачается, даже если сетевое подключение пропадало, с ее помощью можно вытворять массу кунштюков: скачать или наоборот закачать файлы, повторить провалившуюся задачу, скачать только определенную часть файла, выставить кучу параметров типа аутентификации… Крутая, в общем =) 

Но, повторюсь, у меня она в основном скачивала файлы. Давайте посмотрим как можно реализовать эту задачу на примере.

Начнем с создания задачи:

BITSAdmin /CREATE /DOWNLOAD DownloadJob1

image

Легко видеть, что задача была создана, ей назначен некий GUID, который Вы можете использовать позднее (я буду использовать имя). А еще прекрасно видно уведомление о том, что команда устарела. =( Давайте посмотрим внутрь созданной задачи:

BITSadmin /LIST /VERBOSE

image

(ага, МНОГО информации). Очевидно, на данный момент в задаче нет никаких заданий (FILES: 0 / 0), так что давайте кое-что туда добавим:

BITSadmin /ADDFILE DownloadJob1 <URL> <PathToSavedFile>

image

Все добавилось и даже уже создан временный файл:

image

добавим еще один:

image

и увидим второй временный файл:

image

Оба файла пока имеют размер 0 байт. Теперь мы можем получить больше информации о нашей задаче:

image

Тут уже видны оба скачиваемых файла (JOB FILES) и… Мы уже можем подождать, когда файлы скачаются? Увы, нет, поскольку задача еще не запущена (STATE: SUSPENDED). Нам нужно запустить ее и это очень просто:

BITSADMIN /RESUME DownloadJob1

image

Теперь наша задача в состоянии TRANSFERRING, мы можем видеть как много байт (BYTES) или файлов (FILES) уже передано и все такое. И тут – БАМС! Что-то пошло не так и у нас оборвалось соединение: image. Будет ли это мешать нашей скачке? Да:

image

Состояние закачки теперь TRANSIENT_ERROR. Должны ли мы беспокоиться об этом и предпринимать какие-то действия? Нет, поскольку как только соединение восстановится, наша закачка перейдет в состояние QUEUD и потом продолжится автоматически:

image

Смотреть изредка на эту большую картинку постоянно вводя команду /LIST неинтересно, так что мы будем наблюдать за скачиванием по другому: 

BITSadmin /MONITOR /REFRESH 1

image

Эта команда будет отображать состояние наших задач, периодически (в примере каждую секунду) его обновляя:

image

Ну и как только наши файлы скачаются:

image

мы сможем пойти в место, куда из скачивали и… Ой… Что это?

image

Файлы имеют соответствующие размеры, но их имена… Все нормально, файлы еще в виде временных, поскольку задача не завершена, хотя закачка уже и окончена. Нам остался один последний маленький шажок:

BITSadmin /COMPLETE downloadJob1

image

Опять “ой”. Похоже, BITSadmin считает имена заданий чувствительными к регистру. Запомним это и введем команду по-новой:

BITSadmin /COMPLETE DownloadJob1

image

Вуаля! Файлы на своих местах и больше нет никакой работы – все по мне =)

image

З.Ы. Простите мне этот маленький экзерсис по поводу устаревшей программы: просто не смог удержаться Winking smile

З.З.Ы. Если она Вам тоже нравится, читаем тут, тут и тут.

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

Unknown комментирует...

Кошмар какойто. И всё это вместо import-module bitsTransfer
start-bitstransfer урл

Alexander Trofimov комментирует...

1) Да ну ладно тебе - всего-то две команды.
2) Да ты чо! Это ж как в фаллаут тактикс играть вместо второго ;)
3) На самом деле я сразу написал, что надо бы посмотреть на PoSh, но руки не доходят

Выбирай любое объяснение из трех ;)