Передача (больших) файлов с использованием 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
Перевод: Виктор Горбунков
Comments
- Anonymous
June 09, 2010
Возникла проблема. При копировании на удалённый сервер скриптом в шедуллере без активной сесии статус переводиться в suspended. Копирование не происходит. Resume-Bitstransfer не помогает и выдает ошибку. При активной сесии скрипт отрабатывается на ура. Как побороть?