Как использовать модуль BITS для передачи файлов с помощью PowerShell
Менее известной функцией Windows является фоновая интеллектуальная служба передачи (BITS). Это сервис, предназначенный в первую очередь для программистов и системных администраторов и предназначенный для передачи файлов на серверы HTTP и SMB и обратно.
Вот некоторые из невероятно полезных функций этого сервиса:
- Обработка прерываний сети
- Пауза и возобновление даже после перезагрузки
- Учитывать стоимость сети.
В этой статье мы рассмотрим, как использовать BITS в PowerShell для выполнения и управления операциями передачи файлов.
Начало работы с BITS
Командлеты BITS на самом деле являются встроенными командами PowerShell по умолчанию. Мы можем увидеть, что это за команды, запустив Get-Command | Где-Источник Объекта -EQ BitsTransfer
.
Хотя PowerShell 7 является кроссплатформенным, он зависит от службы, специфичной для Windows, поэтому эта функция будет недоступна в других операционных системах.
Start-BitsTransfer
Чтобы создать новое задание передачи BITS, в которое затем можно добавлять или удалять файлы, используйте командлет Start-BitsTransfer
. Чтобы просто передавать файлы между двумя местоположениями, вы можете определить источник и место назначения, как показано ниже.
$Params = @{
"Source" = '\\Server01\C$\TestFile.txt'
"Destination" = '\\Server02\C$\TestFile.txt'
}
Start-BitsTransfer @Params
Чтобы воспользоваться преимуществами других командлетов BITS, лучше всего присвоить заданию передачи BITS правильное DisplayName
, на которое впоследствии можно будет ссылаться. Используя то же объявление @Params
, мы можем добавить отображаемое имя, в данном случае TestTransfer
.
Start-BitsTransfer @Params -DisplayName 'TestTransfer'
По умолчанию передача BITS выполняется с приоритетом Foreground
, что подразумевает самую высокую доступную скорость передачи. Это можно легко изменить, используя один из доступных приоритетов, перечисленных ниже.
- Передний план (по умолчанию): передает задание с наивысшим приоритетом и конкурирует за сетевые ресурсы с другими приложениями.
- Высокий: передача с более высоким приоритетом, чем обычно, но по-прежнему зависит от незадействованной пропускной способности сети клиентского компьютера.
- Обычный: то же, что и высокий приоритет, но с более низким приоритетом.
- Низкий: такой же, как обычный приоритет, но с самым низким возможным приоритетом.
Как упоминалось в начале, BITS обладает уникальной способностью учитывать стоимость сети. Для этого мы используем параметр 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
Что, если бы мы захотели проверить все запущенные задания BITS, это легко сделать с помощью командлета Get-BitsTransfer
.
Поскольку ранее мы назвали наш перевод TestTransfer
, его легко найти. Запуск Get-BitsTransfer
сам по себе отобразит список всех запущенных заданий.
Add-BitsFile
Теперь, когда мы получили нашу передачу, мы можем фактически добавить дополнительные файлы к этой передаче, просто вызвав Add-BitsFile
.
$Job = Get-BitsTransfer -Name 'TestTransfer'
$Params = @{
"Source" = '\\Server01\C$\TestFile2.txt'
"Destination" = '\\Server02\C$\TestFile2.txt'
}
$Job | Add-BitsFile @Params
Suspend-BitsTransfer
При передаче всех этих файлов иногда возникает необходимость приостановить передачу. Это может произойти по многим причинам. Часто это происходит из-за перегруженной сети или необходимости перезагрузки системы во время передачи. В BITS это делается просто с помощью функции Suspend-BitsTransfer
.
$Job | Suspend-BitsTransfer
Резюме-BitsTransfer
Естественно, в какой-то момент нам нужно будет снова запустить задание, и снова это так же просто, как передать задание в Resume-BitsTransfer
.
$Job | Resume-BitsTransfer
Set-BitsTransfer
Если задание все еще активно, его можно обновить с новыми настройками с помощью командлета Set-BitsTransfer
. В приведенном ниже примере мы устанавливаем для задания максимально возможный сетевой приоритет. Первоначально мы установили задание на Нормальный
, но нам нужно выполнить задание раньше, поэтому мы используем Foreground
.
$Job | Set-BitsTransfer -Priority 'Foreground'
Complete-BitsTransfer
Возможно, мы приостановили работу и готовы закончить перенос. С помощью командлета Complete-BitsTransfer
мы можем указать BITS завершить все активные задания по передаче.
Get-BitsTransfer | Complete-BitsTransfer
Remove-BitsTransfer
Наконец, если нам просто нужно удалить задание, работающее или нет, мы можем использовать командлет Remove-BitsTransfer
.
Get-BitsTransfer -Name "JobToBeRemoved" | Remove-BitsTransfer -Confirm:$False
Использование -Confirm:$False
означает, что задания будут удалены без запроса подтверждения.
Дополнительные возможности BITS
Примеры, показанные в приведенных выше процессах, были сосредоточены на загрузке файла с одного сервера на другой. BITS также имеет возможность загрузить файл, даже с аутентификацией.
$Params = @{
"Source" = '\\Server01\C$\TestFile.txt'
"Destination" = '<http://server02/uploaddir/testfile.txt>'
"TransferType" = 'Upload'
}
Start-BitsTransfer @Params
Важно отметить, что поведение BITS по умолчанию заключается в автоматической загрузке нескольких файлов. Это не то же самое, что и при загрузке, и чтобы обойти это ограничение, вы можете передать несколько файлов командлету Start-BitsTransfer
.
Если целевой сервер защищен аутентификацией, вы можете указать тип, например Basic
, Digest
, NTLM
, Negotiate
или Паспорт
с помощью параметра Аутентификация
. Конечно, при использовании аутентификации вам нужно будет передать учетные данные, что можно легко сделать с помощью параметра Credential
. Он использует стандартные объекты PSCredential
и хорошо работает для обеспечения безопасности и шифрования ваших секретов в ваших скриптах.
Заключение
BITS — это фантастический способ управления передачей файлов между серверами и между веб-серверами. Благодаря возможности приостанавливать и возобновлять передачу файлов по сетевым каналам легко контролировать, даже те, которые требуют модерации из-за потенциальной стоимости.
Несмотря на то, что это работает только в Windows, BITS является мощным инструментом для интеграции в ваши сценарии и точного управления передачей файлов даже при перезагрузке. Потенциально заменяя традиционные утилиты Windows, такие как Robocopy, BITS придерживается методологии PowerShell и, благодаря возможности фоновой передачи в виде заданий, легко интегрируется в существующую автоматизацию и сценарии.