Передача (больших) файлов с использованием BITs

У вас бывали сбои при копировании файлов? Приводило ли это вас в бешенство, или как? Как насчет ситуации, когда это был ДЕЙСТВИТЕЛЬНО большой файл, копирование заняло несколько часов и вот ПРЯЯЯМО перед тем, как оно должно было закончиться, что-то случилось и передача прервалась, и пришлось начинать все сначала. Не захотелось ли вам при этом убить себя, засунув поглубже в нос заточенный карандаш №2, или как-нибудь еще?

Я принялся думать об этих вещах, когда увидел, что W7 и бета WS08/R2 стали доступны, и что спрос был настолько высоким, что серверам едва удавалось справляться с нагрузкой. Представьте себе, как бы вы реагировали, если бы после загрузки гигабайта у вас бы произошла ошибка загрузки? Может ли кто-нибудь ПОМОЧЬ? Не может ли кто нибудь дать нам семантику get команд Windows Update, но не для обновления а для файлов, которые нужны лично **МНЕ**?

Забавно, вы должны были упомянуть об этом.

Могу ли я упомянуть о том, что PowerShell V2 – это супер крутая штука? В CTP3 мы получили набор новых коммандлетов, который обеспечивает вам доступ к BITS. BITS – это сокращение от Background Intelligent Transfer Service (Фоновая Интеллектуальная Служба Передачи данных). BITS – это замечательная служба. Это отличная подлива к Windows Update. Хотите ли вы еще раз войти в WU, увидеть пакет обновления размером несколько сотен мегабайт и удивляться, «как каждый ПК на планете получает свои несколько сотен мегабайт обновлений, а Интернет при этом не плавится?” Ответ на этот вопрос - BITS. Мы думаем, что BITS должен использовать каждый. Это относится как к продуктам написаным независимыми разработчиками (ISV) так и к конечным пользователям. Используя BITS, вы получаете полезный опыт. Вы получаете надежное скачивание файлов, адаптивное использование полосы пропускания для ограничения влияния на систему и одноранговое кеширование, которое позволяет до минимума сократить трафик. Вы можете узнать о BITS больше, загрузив документ ОТСЮДА.

Кстати – возможность использовать этот механизм с помощью команды WIN32 BITSADMIN появилась достаточно давно, но об этом мало кто знает и использовать ее довольно трудно. Мы думаем, что у этих коммандлетов есть проблемы с удобством использования, так что перед окночательным релизом мы скорее всего изменим их.

[0]PS> # You need to import the FileTransfer Module to get BITS cmdlets
[1]PS> # Notice that the NOUN is FileTransfer
[2]PS> Import-Module FileTransfer -Verbose
VERBOSE: Importing cmdlet 'Add-FileTransfer'.
VERBOSE: Importing cmdlet 'Clear-FileTransfer'.
VERBOSE: Importing cmdlet 'Complete-FileTransfer'.
VERBOSE: Importing cmdlet 'Get-FileTransfer'.
VERBOSE: Importing cmdlet 'New-FileTransfer'.
VERBOSE: Importing cmdlet 'Resume-FileTransfer'.
VERBOSE: Importing cmdlet 'Set-FileTransfer'.
VERBOSE: Importing cmdlet 'Suspend-FileTransfer'.

[3]PS> # This is the HTTP file that I want to download. I could have
[4]PS> # also used an UNC Path
[5]PS> $file = " https://download.microsoft.com/download/D/0/E/D0E6D2C1-2593-401
7-B26D-7375BC9263D5/PowerShell_Setup_amd64.msi"

[6]PS> # This creates a new BITS job running in the background. After
[7]PS> # this command the file will get transferred even if
[8]PS> # this process terminates
[9]PS> # this machine (or the server) reboots.
[10]PS> # the network goes down and comes back up.
[11]PS> New-FileTransfer -ServerFileName $file -ClientFileNamePrefix c:\Kits -
DisplayName PSAMD -Asynchronous

JobId DisplayName TransferType JobState OwnerAccount
----- ----------- ------------ -------- ------------
5652f872-c8d... PSAMD Download Connecting RugratsVist...

[12]PS> $job = Get-FileTransfer PSAMD

[13]PS> # Let's take a look at what we have
[14]PS> $job |format-list *

JobId : 5652f872-c8db-4423-a28f-70c10e1600f4
DisplayName : PSAMD
Description : This is a transfer using Background Intelligent Tra
nsfer Service.
TransferType : Download
JobState : Transferring
OwnerAccount : RugratsVista\jsnover
Priority : Normal
MinimumRetryDelay : 600
NoProgressTimeout : 1209600
TransientErrorCount : 0
ProxyUsage : SystemDefault
ErrorContext : None
ErrorCondition : NoError
InternalErrorCode : 0
ErrorDescription :
ErrorContextDescription :
BytesTotal : 10313216
BytesTransferred : 1063897
FilesTotal : 1
FilesTransferred : 0
CreationTime : 1/11/2009 9:03:06 AM
ModificationTime : 1/11/2009 9:03:11 AM
TransferCompletionTime : 1/1/0001 12:00:00 AM
FileList : {https://download.microsoft.com/download/D/0/E/D0E6D
                          2C1-2593-4017-B26D-7375BC9263D5/PowerShell_Setup_am
d64.msi}
ProxyList :
ProxyBypassList :

[15]PS> # Notice that you don't see anything until the job is complete
[16]PS> # Actually, in -Asynchronous mode, you want see anything
[17]PS> # until *YOU* complete the FileTransfer (with a Complete-FileTransfer)

[18]PS> dir c:\Kits\power*

[19]PS> # The transfer is smart about bandwidth utilization and will
[20]PS> # scale back when it detects interactive use or competition for
[21]PS> # the network. You can control this with the -Priority flag
[22]PS> # which takes values:
[23]PS> # Forground, High, Normal, Low
[24]PS> # You can also manually suspend the job for any reason
[25]PS> Suspend-FileTransfer $job

JobId DisplayName TransferType JobState OwnerAccount
----- ----------- ------------ -------- ------------
5652f872-c8d... PSAMD Download Suspended RugratsVist...

[26]PS> $job

JobId DisplayName TransferType JobState OwnerAccount
----- ----------- ------------ -------- ------------
5652f872-c8d... PSAMD Download Suspended RugratsVist...

[27]PS> # This is how you resume the FileTransfer.
[28]PS> Resume-FileTransfer $job -Asynchronous

JobId DisplayName TransferType JobState OwnerAccount
----- ----------- ------------ -------- ------------
5652f872-c8d... PSAMD Download Connecting RugratsVist...

[29]PS> $job

JobId DisplayName TransferType JobState OwnerAccount
----- ----------- ------------ -------- ------------
5652f872-c8d... PSAMD Download Transferred RugratsVist...

[30]PS> # When the job is complete, you have to use this command to
[31]PS> # make the files show up and to clean up the job
[32]PS> Complete-FileTransfer $job

[33]PS> dir c:\Kits\power*

    Directory: C:\Kits

Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- 12/15/2008 5:08 AM 10313216 PowerShell_Setup_amd64.msi

Каждый должен использовать BITS.

Экспериментируйте, не скучайте, подключайтесь.

Джеффри Сновер (Jeffrey Snover) [MSFT]
Windows Management Partner Architect
Посетите английский блог команды  Windows PowerShell:    https://blogs.msdn.com/PowerShell
Посетите Windows PowerShell ScriptCenter:  https://www.microsoft.com/technet/scriptcenter/hubs/msh.mspx

Перевод: Виктор Горбунков