Если вам нужно скачать (передать) большой файл на удаленный компьютер, не нагружая канал передачи данных, рекомендуем воспользоваться протоколом 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
Клиент BITS скачает файл в синхронном режиме и сохранит его в указанный локальный каталог. На экране появится полоса, показывающая процесс загрузки. При потере подключения докачка файла не выполняется (придется заново скачивать весь файл целиком). Т.е. команда загрузки в таком режиме аналогична скачиванию файла с сайта с помощью Invoke-WebRequest.
Асинхронная загрузка файлов с докачкой по протоколу BITS
Для загрузки файлов по BITS в асинхронном режиме (с докачкой), нужно добавить параметр –asynchronous:
Start-BitsTransfer –source http://testsite.contoso.com/netinst.iso -destination c:\temp -asynchronous
Асинхронное задание BITS будет автоматически продолжено при обрывах соединениях или перезагрузке источника или приемника.
По умолчанию задание BITS занимает всю доступную ширину канала связи (режим Foreground). Чтобы задание BITS использовало только неиспользуемую емкость канала связи, нужно добавить параметр -Priority low. В этом случае задание загрузки BITS не будет конкурировать за канал передачи с другими сервисами.
Управление заданиями BITS с помощью PowerShell
Команда создаст новое задание BITS, которое будет выполняться в фоновом режиме. Чтобы проверить статус заданий загрузки BITS, выполните команду:
Get-BitsTransfer | fl
Команда возвращает статус передачи (в данном случае передача окончена, Transferred), информацию о количестве переданных байт, общем размере файла, времени создания и завершения задания BITS.
Получить статус всех фоновых заданий BITS на компьютере:
Get-BitsTransfer | select DisplayName, BytesTotal, BytesTransferred, JobState | Format-Table -AutoSize
После завершения загрузки файла, нужно выполнить команду:
Get-BitsTransfer| where JobState -eq 'Transferred'| Complete-BitsTransfer
Если этого не сделать, клиент BITS не переименует автоматически временный файл с расширением TMP в целевом каталоге в исходное имя файла.
С помощью BITS можно копировать файлы не только по HTTP, но и по-обычному SMB протоколу Windows. Чтобы скопировать файл на удаленный компьютер в административную шару C$ или в общую сетевую папку, нужно указать UNC путь:
Start-BitsTransfer -Source C:\iso\win11.iso -Destination \\srv01\c$\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
Следующий 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).