Поиск по сайту:

Как использовать модуль 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 и, благодаря возможности фоновой передачи в виде заданий, легко интегрируется в существующую автоматизацию и сценарии.