Powershell BITS (Background Intelligent Transfer Service) - это серия командлетов, которая позволяет скачивать файлы используя одноименный протокол в синхронной и асинхронной загрузке. Особенность в том, что если наш канал забит на 70%, то протокол будет использовать 30% и не будет конкурировать за скорость (по умолчанию такого приоритета нет). BITS давно используется в некоторых службах Microsoft типа WSUS. Этот командлет пришел на замену старой утилиты bitsadmin. Через команды можно установить приоритеты работы, а через политики конкретно скорость. Работает по протоколу HTTP/S (80/443)
Если вы хотите узнать какая у вас версия сначала нужно выполнить импорт модуля:
Import-Module -Name BitsTransfer
Затем получить данные по командлетам:
Get-Command -Module BitsTransfer
Можно так же увидеть работающий сервис:
Get-Service -Name *BITS*
Из доступных методов аутентификации есть для прокси (ключ -ProxyAuthentication) и для конечного сервера (ключ -Authentication):
- Basic
- Digest
- NTLM
- Negotiate
- MS Passport
Скачивание файлов через Powershell BITS
Для начала скачивания нужно выполнить командлет:
Start-BitsTransfer -Source "\\server\ubuntu.iso" -Destination C:\
Где:
-Source - откуда скачиваем
-Destination - куда
Режим по умолчанию синхронный. Об этом так же говорит подобная картинка:
Если при синхронной работе у нас или источника будут проблемы с каналом, выключится компьютер например, то процесс прервется без возможности восстановления. Так же будет если мы нажмем Ctr+C.
Для того что бы выполнить асинхронное скачивание нужно добавить ключ -Asynchronous:
Start-BitsTransfer -Source "\\server\ubuntu.iso" -Destination C:\ -Asynchronous -DisplayName "AsyncDownload"
В асинхронном режиме у нас появляется информация только о начатой задаче:
В предыдущей команде я добавил ключ -DisplayName, который дает имя задаче иначе оно будет по умолчанию. С помощью этой команды мне будет легче идентифицировать процесс и его статус:
Get-BitsTransfer | SELECT *
Можно увидеть поля BytesTotal(сколько весит документ) и BytesTransferred (сколько скачено). Если у нас прервется соединение, то в асинхронном режиме никаких уведомлений не будет (в отличие от синхронного). Для того что бы увидеть проблему нужно еще раз запустить этот командлет:
Восстановление процесса произойдет либо через 10 минут (по умолчанию) либо в ручную. При этом, всегда когда мы работаем с существующим процессом BITS мы должны передавать объект либо через конвейер (как на примере ниже) либо через переменную. Если не указать имя для процесса, то Resume произойдет для всех:
Get-BitsTransfer -Name "AsyncDownload" | Resume-BitsTransfer -Asynchronous
При этом ключ -Asynchronous нужно указывать обязательно если не желаете синхронную.
Если мы передумали, то возможно выполнить Remove:
Get-BitsTransfer | Remove-BitsTransfer
Если хотим приостановить процесс (подходит и для синхронной загрузке) можно использовать:
Get-BitsTransfer | Suspend-BitsTransfer
Есть вариант скачивания сразу на удаленную машину в обоих режимах, по протоколу HTTP/S:
Start-BitsTransfer -Source "\\Server1\ubuntu.iso" -Destination \\Server2\ -DisplayName "ShipBits"
После окончания, в случае асинхронной работы, нам нужно завершить процесс командой:
Get-BitsTransfer -Name "AsyncDownload" | Complete-BitsTransfer
Только после этого файл преобразуется из tmp.
Из неописанного есть ключ -UseStoredCredential , который проверит учетные данные в Windows Credential Manager или другие учетки с ключом -Credential.
Установка приоритета загрузки в Powershell BITS
У нас доступны 4 вида приоритетов загрузки
- Foreground - задачи самого приоритетного плана с конкуренцией за канал. Стоит по умолчанию.
- High - Используется только свободная часть канала, но приоритет среди других задач будет выше.
- Normal - Только свободная часть канала, но приоритет ниже чем у High
- Low - Самый низкий приоритет, только свободный канал.
Мы можем использовать этот приоритет во время начала закачивания:
Start-BitsTransfer -Source $path -Destination C:\Test\ -DisplayName "ShipBits" -Asynchronous -Priority Normal
Где:
-Priority - режим приоритета
Указываем приоритет загрузки уже у созданного, рабочего процесса:
Get-BitsTransfer -Name "Test" | Set-BitsTransfer -Priority Low
Как и у Start, так и Set есть ключи для интервала возобновления загрузки:
Get-BitsTransfer -JobId "6e74e59f-31b3-4d51-b7d6-0d40fd4a9d4c" | Set-BitsTransfer -RetryInterval 60 -RetryTimeout 60
Где:
-RetryInterval - То, сколько времени должно пройти для повторной попытки скачивания, в секундах. Минимально 60 секунд. По умолчанию 600 секунд (10 минут).
-RetryTimeout - В течении какого времени эти попытки будут происходить. По умолчанию в течение 14 дней. Если установить 0, то никаких попыток не будет.
Мы так же можем установить скорость для BITS, но это делается в политиках. Политики находятся:
Computer Configuration -> Administrative Templates -> Network -> Background Intelligent Transfer Service (BITS)
Загрузка через Powershell BITS
Для закачивания есть два значения, которые указываются в ключе -TranferType. Всего значения три:
-Download - по умолчанию.
-Upload
-UploadReply - загружает файл и получает копию.
Командлет аналогичный:
Start-BitsTransfer -Source $path -Destination \\Server\Test\ -DisplayName "ShipBits" -Asynchronous -Priority Normal -TransferType Upload
Причем мы не сможем делать Upload для того что бы скачать одновременно скачивать файл и передавать на другой компьютер, а вот с Download можем.
Скачивание и загрузка множества файлов
Скачивать мы можем папками с помощью wildcard * :
Start-BitsTransfer -Source \\AD\C$\Folder1\* -Destination C:\Folder2 -Asynchronous
Мы можем скачать только определенный тип, добавив расширение:
Start-BitsTransfer -Source \\AD\C$\Folder1\*.txt -Destination C:\Folder2 -Asynchronous
Если мы используем асинхронное скачивание - не забываем завершить процесс:
Или использовать командлет Add-BitsFile, который позволяет добавлять файлы во время скачивания:
Get-BitsTransfer | Add-BitsFile -Source \\CL1\D$\Photo\*.jpg -Destination C:\s
Загружать можно только файл. Вариант прогнать через цикл, но в таком случае будет множество процессов:
Get-ChildItem -Path $source |
foreach {
$destination = "\\AD\C$\Folder3\$($_.name)"
$bits = Start-BitsTransfer -Source $($_.Fullname) -Destination $destination -TransferType Upload -Asynchronous
}
В документации Microsoft есть вариант использования CSV файлов через конвейер с Add-BitsFile, но у меня так и не сработало. Возможно или неверная документация.
На веб сервере BIts можно включить тут:
...
Подписывайтесь на наш Telegram канал
Теги: #powershell