Использование BITS в PowerShell для управления передачей файлов

Быстрые ссылки
- Getting Started with BITS
- Additional BITS Capabilities
- Conclusion
Введение
Background Intelligent Transfer Service (BITS) — это служба Windows, предназначенная для надёжной фоновой передачи файлов между клиентами и серверами по протоколам HTTP и SMB. Основные преимущества BITS:
- Устойчивость к сетевым прерываниям
- Поддержка приёма/возобновления передачи, в том числе после перезагрузки системы
- Учет стоимости сети и ограничений пропускной способности
В этой статье показано, как использовать BITS через PowerShell для создания, контроля и завершения заданий передачи. Примеры ориентированы на Windows и PowerShell, так как BITS — Windows-специфичный сервис.
Основные понятия
- Задание BITS: объект, который хранит список файлов и метаданные трансфера
- TransferPolicy: политика передачи (например, “Capped” для ограничения трафика)
- Priority: приоритет задания (Foreground, High, Normal, Low)
Краткие определения даны для быстрого понимания терминов, используемых далее.
Начало работы с BITS в PowerShell
BITS cmdlet уже встроены в PowerShell. Список команд можно получить командой:
Get-Command | Where-Object Source -EQ 'BitsTransfer'
Важно: даже если вы используете PowerShell 7 на других ОС, функциональность BITS доступна только в Windows, потому что она опирается на системную службу Windows.
Создание задания Start-BitsTransfer
Чтобы создать новое задание BITS и сразу передать файлы между двумя локациями, используйте Start-BitsTransfer со свойствами Source и Destination:
$Params = @{
"Source" = '\\Server01\C$\TestFile.txt'
"Destination" = '\\Server02\C$\TestFile.txt'
}
Start-BitsTransfer @Params
Рекомендуется задавать DisplayName, чтобы в дальнейшем легко ссылаться на задание:
Start-BitsTransfer @Params -DisplayName 'TestTransfer'
По умолчанию приоритет задания — Foreground (наивысшая скорость). Возможные приоритеты:
- Foreground — максимальная приоритетность и конкуренция за сеть с другими приложениями
- High — выше нормального, использует незанятую полосу клиента
- Normal — обычный приоритет
- Low — минимальный приоритет, минимально мешает пользователю
Пример задания с нормальным приоритетом:
Start-BitsTransfer @Params -DisplayName 'TestTransfer' -Priority 'Normal'Чтобы учесть стоимость сетевого трафика (например, платные сети или лимитированные каналы), используйте TransferPolicy:
$Params = @{
"Source" = '\\Server01\C$\TestFile.txt'
"Destination" = '\\Server02\C$\TestFile.txt'
"DisplayName" = 'TestTransfer'
"Priority" = 'Normal'
"TransferPolicy" = 'Capped'
}
Start-BitsTransfer @Params
Значение Capped означает, что есть верхняя граница трафика, которой следует придерживаться.
Чтобы запустить задание в фоновом режиме и получить обратно консоль, используйте флаг Asynchronous:
Start-BitsTransfer @Params -Asynchronous
Просмотр заданий Get-BitsTransfer
Список всех активных заданий выводит Get-BitsTransfer. Если вы задали DisplayName, например TestTransfer, его легко найти:
Get-BitsTransfer
Get-BitsTransfer -Name 'TestTransfer'Добавление файлов в задание Add-BitsFile
Вы можете добавлять дополнительные файлы в уже созданное задание:
$Job = Get-BitsTransfer -Name 'TestTransfer'
$Params = @{
"Source" = '\\Server01\C$\TestFile2.txt'
"Destination" = '\\Server02\C$\TestFile2.txt'
}
$Job | Add-BitsFile @Params
Приостановка и возобновление заданий
Чтобы приостановить текущее задание (например, для перезагрузки или освобождения полосы), используйте:
$Job | Suspend-BitsTransfer
Для возобновления:
$Job | Resume-BitsTransfer
Обновление задания Set-BitsTransfer
Если задание ещё активно, можно изменить его параметры, например приоритет:
$Job | Set-BitsTransfer -Priority 'Foreground'
Завершение задания Complete-BitsTransfer
Когда передача завершена и вы хотите пометить задание как завершённое, выполните:
Get-BitsTransfer | Complete-BitsTransfer
Удаление задания Remove-BitsTransfer
Чтобы удалить задание независимо от его состояния, используйте:
Get-BitsTransfer -Name "JobToBeRemoved" | Remove-BitsTransfer -Confirm:$False
Флаг -Confirm:$False отключает запрос подтверждения.
Дополнительные возможности BITS
BITS умеет не только скачивать — он поддерживает и загрузку на HTTP-серверы, включая варианты с аутентификацией.
Пример загрузки (Upload):
$Params = @{
"Source" = '\\Server01\C$\TestFile.txt'
"Destination" = ''
"TransferType" = 'Upload'
}
Start-BitsTransfer @Params
Особенности загрузок:
- По умолчанию BITS автоматически группирует несколько файлов для скачивания, но с загрузками это не происходит автоматически. Чтобы отправить несколько файлов, можно пропайпить их в Start-BitsTransfer.
- Для доступа к защищённым ресурсам указывают Authentication (Basic, Digest, NTLM, Negotiate, Passport) и передают Credential как PSCredential объект.
Пример передачи с указанием учётных данных:
$cred = Get-Credential
$Params = @{
"Source" = '\\Server01\C$\TestFile.txt'
"Destination" = 'http://server02/uploaddir/testfile.txt'
"TransferType" = 'Upload'
"Authentication" = 'NTLM'
"Credential" = $cred
}
Start-BitsTransfer @ParamsКогда BITS может не подойти
(Контрпримеры)
- Не работает на Linux/macOS: BITS — Windows-only.
- Не подходит для потоковой передачи или низкой задержки (естественная латентность фоновых заданий и механизмы восстановления).
- Если нужна детальная синхронизация больших директорий с множеством атрибутов и метаданных, Robocopy или специализированные синхронизаторы могут быть предпочтительнее.
- Для одноразовой простой загрузки/скачивания небольшого файла проще использовать Invoke-WebRequest или curl.
Альтернативные подходы
- Robocopy — лучше для зеркалирования директорий и сохранения атрибутов файлов; часто быстрее для больших каталогов при локальных сетях.
- BITS — лучше, если важна устойчивость к разрывам сети, фоновые задания и учёт стоимости трафика.
- AzCopy, rclone — для облачных хранилищ и кроссплатформенных задач.
Модель принятия решений (упрощённая)
flowchart TD
A[Нужно передавать файлы] --> B{Требуется ли фоновая передача с возобновлением?}
B -- Да --> C{Рабочая ОС — Windows?}
B -- Нет --> D[Invoke-WebRequest / curl / Robocopy]
C -- Да --> E[Использовать BITS через PowerShell]
C -- Нет --> F[Использовать rclone/azcopy/robocopy на подходящей ОС]Шпаргалка по cmdlet (cheat sheet)
- Start-BitsTransfer — создать и/или запустить задание
- Get-BitsTransfer — перечислить задания
- Add-BitsFile — добавить файл в задание
- Suspend-BitsTransfer — приостановить задание
- Resume-BitsTransfer — возобновить задание
- Set-BitsTransfer — изменить параметры задания
- Complete-BitsTransfer — пометить задание как завершённое
- Remove-BitsTransfer — удалить задание
Ролевые чек-листы
Администратор инфраструктуры:
- Убедиться, что служба BITS запущена и доступна
- Использовать DisplayName для отслеживания заданий
- Настроить TransferPolicy для платных каналов
- Логировать события и ошибки BITS через Event Viewer
Разработчик автоматизации:
- Оборачивать Start-BitsTransfer в скрипты с обработкой ошибок
- Хранить креденшалы в безопасном хранилище (Credential Manager, Key Vault)
- Использовать -Asynchronous и проверять состояние задания через Get-BitsTransfer
Оператор поддержки:
- Проверять статус заданий и сообщения ошибок в Get-BitsTransfer
- Использовать Complete-BitsTransfer после успешной проверки целостности
- Удалять неиспользуемые задания с Remove-BitsTransfer
Тест-кейсы и критерии приёмки
Примеры тестов для автоматизации передачи с помощью BITS:
- Создание задания и успешная передача файла в нормальных сетевых условиях
- Приостановка и возобновление после симулированного разрыва сети
- Возобновление задания после перезагрузки системы
- Передача с TransferPolicy=Capped минимизирует использование трафика в пик
- Загрузка на защищённый HTTP-ресурс с разными типами Authentication
Критерии приёмки:
- Файл доставлен в целевую директорию в целости
- Скрипт корректно обрабатывает исключения и возвращает коды завершения
- При возобновлении после разрыва передача продолжается с последнего смещения
Безопасность и конфиденциальность
- Храните учётные данные как PSCredential, а не в открытом тексте скрипта.
- Если используете Basic-аутентификацию, по возможности применяйте HTTPS.
- Логируйте только необходимые метаданные заданий, не включайте чувствительные данные в логи.
- Для соответствия требованиям локального законодательства (например, GDPR) проверьте, где хранятся и через какие каналы передаются персональные данные.
Советы и эвристики
- Используйте DisplayName с префиксом среды (prod/test) для быстрой фильтрации.
- Для массовых загрузок формируйте список файлов и пайпьте его в Start-BitsTransfer.
- Если нужно зеркалировать каталоги с метаданными, рассматривайте Robocopy; если нужна устойчивость к разрывам и фоновая отправка — BITS.
Сравнение BITS и Robocopy (кратко)
- Надёжность при разрывах: BITS — сильный, Robocopy — работает, но без фоновых политик
- Поддержка фоновых приоритетов и учёта стоимости: только BITS
- Сохранение метаданных и атрибутов NTFS: Robocopy лучше
Заключение
BITS — мощный инструмент Windows для управления передачей файлов, особенно когда важна устойчивость к ошибкам сети и возможность фоновой работы с учётом приоритета и стоимости. Интеграция BITS с PowerShell даёт гибкость автоматизации: от простых однофайловых переносов до сложных процессов загрузки с аутентификацией. Выбирайте BITS когда нужна надёжность и фоновые задания; выбирайте Robocopy или облачные утилиты для других сценариев.
Важно: BITS — Windows-специфичен, поэтому для кроссплатформенных решений следует подбирать альтернативы.
Краткая сводка:
- Применяйте DisplayName и TransferPolicy
- Защищайте креденшалы и используйте HTTPS
- Тестируйте поведение при сетевых сбоях и перезагрузках
Похожие материалы
Kaspersky Password Manager: как исправить ошибки
Как исправить ошибку Usbupdate.exe на Dell
Включение командной панели в Firefox и Edge
Резервное копирование в Windows 11 — настройка и советы
Postman — руководство по API-тестированию