PowerShell: используем BITS для копирования (скачивания) больших файлов

Если вам нужно скачать (передать) большой файл на удаленный компьютер, не нагружая канал передачи данных, рекомендуем воспользоваться протоколом BITS. BITS ( Background Intelligent Transfer service ) – это встроенная служба Windows для передачи файлов между компьютерами, которая поддерживает асинхронный режим, работу в фоне, поддерживает докачку файлов, может использовать незадействованную пропускную способность сети и динамически изменять скорость загрузки. Таким образом BITS позволяет эффективно передавать большие файлы по нестабильному или медленному каналу, не влияя на трафик других сетевые приложений. В этой статье мы рассмотрим, как скачивать и передавать файлы между компьютерами по протоколу BITS с помощью PowerShell.

Как скачать файл с помощью PowerShell модуля BitsTransfer?

Для управления заданиями BITS можно использовать встроенный PowerShell модуль BitsTransfer .

Чтобы скачать ISO, который хранится на веб сервере IIS с помощью протокола BITS, выполните команду:

Start-BitsTransfer –source http://testsite.contoso.com/netinst.iso -destination c:temp

powershell bitstransfer: скачать файл

Клиент BITS скачает файл в синхронном режиме и сохранит его в указанный локальный каталог. На экране появится полоса, показывающая процесс загрузки. При потере подключения докачка файла не выполняется (придется заново скачивать весь файл целиком). Т.е. команда загрузки в таком режиме аналогична скачиванию файла с сайта с помощью Invoke-WebRequest .

Асинхронная загрузка файлов с докачкой по протоколу BITS

Для загрузки файлов по BITS в асинхронном режиме (с докачкой), нужно добавить параметр –asynchronous :

Start-BitsTransfer –source http://testsite.contoso.com/netinst.iso -destination c:temp  -asynchronous

Start-BitsTransfer асинхронная загрузка файла с докачкой

Асинхронное задание BITS будет автоматически продолжено при обрывах соединениях или перезагрузке источника или приемника.

По умолчанию задание BITS занимает всю доступную ширину канала связи (режим Foreground). Чтобы задание BITS использовало только неиспользуемую емкость канала связи, нужно добавить параметр -Priority low . В этом случае задание загрузки BITS не будет конкурировать за канал передачи с другими сервисами.

Управление заданиями BITS с помощью PowerShell

Команда создаст новое задание BITS, которое будет выполняться в фоновом режиме. Чтобы проверить статус заданий загрузки BITS, выполните команду:

Get-BitsTransfer | fl

Статус загрузки файла с помощью bits

Команда возвращает статус передачи (в данном случае передача окончена, Transferred ), информацию о количестве переданных байт, общем размере файла, времени создания и завершения задания BITS.

Получить статус всех фоновых заданий BITS на компьютере:

Get-BitsTransfer | select DisplayName, BytesTotal, BytesTransferred, JobState | Format-Table -AutoSize

После завершения загрузки файла, нужно выполнить команду:

Get-BitsTransfer| where JobState -eq 'Transferred'| Complete-BitsTransfer

Если этого не сделать, клиент BITS не переименует автоматически временный файл с расширением TMP в целевом каталоге в исходное имя файла.

Завершить фоновое задание копирования BITS

С помощью BITS можно копировать файлы не только по HTTP, но и по-обычному SMB протоколу Windows. Чтобы скопировать файл на удаленный компьютер в административную шару C$ или в общую сетевую папку, нужно указать UNC путь:

Start-BitsTransfer -Source C:isowin11.iso -Destination \srv01c$iso -Asynchronous -DisplayName CopyISOtoSRV

Вы можете временно приостановить задание BITS:

Get-BitsTransfer -Name CopyISOtoSRV| Suspend-BitsTransfer

Возобновить загрузки файла:

Get-BitsTransfer -Name CopyISOtoSRV| Resume-BitsTransfer -Asynchronous

Если нужно выполнить аутентификацию на удаленном сервере для доступа к файлу, используйте команду:

Start-BitsTransfer -source _http://10.2.2.148/erd65_32.iso -destination c:temp -asynchronous -Priority low -Authentication NTLM -Credential Get-Credential

bits с аутентификацией

Следующий PowerShell скрипт можно использовать для отслеживания статуса задания загрузки большого файла. На экран будет выводиться процент выполнения загрузки, а после окончания задания файл переименует TMP файл в исходный формат

$job = Start-BitsTransfer -Source _http://10.2.2.148/erd65_32.iso -Destination c:temp -Asynchronous
while( ($job.JobState.ToString() -eq 'Transferring') -or ($job.JobState.ToString() -eq 'Connecting') )
{
Write-host $Job.JobState.ToString()
$Pro = ($job.BytesTransferred / $job.BytesTotal) * 100
Write-Host $Pro “%”
Sleep 3
}
Complete-BitsTransfer -BitsJob $job

BITS широко используется для фоновой передачи файлов в Windows сетях. Именно этот протокол используется для загрузки обновления через Windows Update (в том числе с сервера обновлений WSUS ). Задание копирования файла через BITS выполнятся несмотря на разрывы связи, перезагрузки компьютеров, не так загружает канал связи, и не мешает работе других сетевых приложений и пользователей. Протокол BITS может быть оптимальным решением для передачи по WAN сетям больших файлов ISO образов и файлов виртуальных машин (vmdk, vhdx).

EnglishRussianUkrainian