Como usar o módulo BITS para transferir arquivos usando PowerShell

Um recurso menos conhecido do Windows é o Background Intelligent Transfer Service (BITS). Este é um serviço, principalmente para programadores e administradores de sistema, que trabalha para transferir arquivos de e para servidores HTTP e SMB.
Aqui estão alguns dos recursos incrivelmente úteis deste serviço:
- Lidar com interrupções de rede
- Pausar e retomar, mesmo após uma reinicialização
- Leve em consideração o custo de rede
Neste artigo, exploramos como usar o BITS no PowerShell para executar e controlar operações de transferência de arquivos.
Introdução ao BITS
Os cmdlets BITS são, na verdade, integrados como comandos padrão do PowerShell. Podemos ver quais são esses comandos executando Get-Command | Where-Object Source -EQ 'BitsTransfer'.

Embora o PowerShell 7 seja multiplataforma, ele depende de um serviço específico do Windows, portanto, essa funcionalidade não estará disponível em outros sistemas operacionais.
Start-BitsTransfer
Para criar um novo trabalho de transferência de BITS, ao qual você pode adicionar ou remover arquivos, use o cmdlet Start-BitsTransfer. Para simplesmente transferir arquivos entre dois locais, você pode definir uma origem e um destino conforme mostrado abaixo.
$ Params = @ {"Source" = '\\\\ Server01 \\ C $ \\ TestFile. txt' "Destination" = '\\\\ Server02 \\ C $ \\ TestFile. txt '} Start-BitsTransfer @Params Publicidade
Para aproveitar as vantagens dos outros cmdlets do BITS, é melhor dar ao trabalho de transferência do BITS um DisplayName adequado que possa ser referenciado posteriormente. Usando a mesma declaração @Params, podemos adicionar um nome de exibição, neste caso TestTransfer.
Start-BitsTransfer @Params -DisplayName 'TestTransfer'
Por padrão, a transferência de BITS será executada em uma prioridade de primeiro plano, o que implica na maior velocidade de transferência disponível. Isso pode ser facilmente alterado usando uma das prioridades disponíveis listadas abaixo.
- Primeiro plano (padrão): Transfere o trabalho com a prioridade mais alta e compete por recursos de rede com outros aplicativos.
- Alta: Transfere com uma prioridade mais alta do que o normal, mas ainda depende do uso do largura de banda de rede ociosa do computador cliente.
- Normal: igual à prioridade alta, mas com prioridade inferior.
- Baixa: igual à prioridade normal, mas com a prioridade mais baixa possível. Start-BitsTransfer @Params -DisplayName & # 8216; TestTransfer &’ -Prioridade & # 8216; Normal &’
Conforme mencionado no início, o BITS tem a capacidade única de levar em consideração o custo da rede. Para fazer isso, usamos o parâmetro TransferPolicy.
$ Params = @ {"Source" = '\\\\ Server01 \\ C $ \\ TestFile. txt' "Destination" = '\\\\ Server02 \\ C $ \\ TestFile. txt '"DisplayName" =' TestTransfer '"Priority" =' Normal '"TransferPolicy" =' Capped '} Start-BitsTransfer @Params Neste exemplo, Capped implica que há um limite superior para o tráfego da rede e que deve ser respeitado esse limite.
Finalmente, para iniciar este trabalho em segundo plano e retornar nosso console para uso, passar o parâmetro Asynchronous nos permite colocar o trabalho em segundo plano.
Start-BitsTransfer @Params -Asynchronous
Get-BitsTransfer
E se quiséssemos verificar todos os trabalhos BITS em execução, isso é simples com o cmdlet Get-BitsTransfer.

Publicidade
Como nomeamos nossa transferência com TestTransfer anteriormente, é fácil encontrá-la. A execução de Get-BitsTransfer por si só listará todos os trabalhos em execução.
Add-BitsFile
Agora que recuperamos nossa transferência, podemos adicionar arquivos adicionais a esta transferência simplesmente chamando Add-BitsFile.
$ Job = Get-BitsTransfer -Name 'TestTransfer' $ Params = @ {"Source" = '\\\\ Server01 \\ C $ \\ TestFile2. txt '"Destination" =' \\\\ Server02 \\ C $ \\ TestFile2. txt '} $ Job | Add-BitsFile @Params Suspend-BitsTransfer
Com a transferência de todos esses arquivos, às vezes é necessário pausar a transferência. Isso pode ocorrer por vários motivos. Freqüentemente, é devido a uma rede congestionada ou um sistema precisa ser reiniciado no meio de uma transferência. Isso é simples com o BITS, usando a funcionalidade Suspend-BitsTransfer.
$ Job | Suspend-BitsTransfer
Resume-BitsTransfer
Naturalmente, em algum momento precisaremos começar o trabalho novamente e, novamente, é tão simples quanto passar o trabalho para Resume-BitsTransfer.
$ Job | Resume-BitsTransfer
Set-BitsTransfer
Se um trabalho ainda estiver ativo, é possível atualizar o trabalho com novas configurações usando o cmdlet Set-BitsTransfer. No exemplo abaixo, estamos configurando o trabalho para a prioridade de rede mais alta possível. Originalmente, definimos o trabalho como Normal, mas precisamos concluí-lo antes, então usamos o primeiro plano.
$ Job | Set-BitsTransfer -Priority 'Foreground'
Transferência de bits completa
Talvez tenhamos suspendido um trabalho e estejamos prontos para concluir a transferência. Usando o cmdlet Complete-BitsTransfer, podemos dizer ao BITS para terminar todos os trabalhos de transferência ativos.
Get-BitsTransfer | Complete-BitsTransfer
Remove-BitsTransfer
Finalmente, se precisarmos apenas remover um trabalho, em execução ou não, podemos usar o cmdlet Remove-BitsTransfer.
Get-BitsTransfer -Name "JobToBeRemoved" | Remove-BitsTransfer -Confirm: $ False
Usar -Confirm: $ False significa que os trabalhos serão removidos sem um pedido de confirmação.
Capacidades BITS adicionais
Os exemplos mostrados nos processos acima se concentraram no download de um arquivo de um servidor para outro. O BITS também pode fazer upload de um arquivo, mesmo com autenticação.
$ Params = @ {"Source" = '\\\\ Server01 \\ C $ \\ TestFile. txt' "Destination" = '< http: //server02/uploaddir/testfile. txt> ' "TransferType" = 'Upload'} Start-BitsTransfer @Params É importante observar que o comportamento padrão do BITS é baixar vários arquivos automaticamente. Este não é o mesmo comportamento com o upload e, para contornar essa limitação, você pode canalizar vários arquivos para o cmdlet Start-BitsTransfer.
Se o servidor de destino estiver protegido por autenticação, você pode especificar o tipo como Basic, Digest, NTLM, Negotiate ou Passport usando o parâmetro Authentication. Obviamente, ao usar autenticação, você precisará passar uma credencial, o que pode ser feito facilmente com o parâmetro Credential. Isso usa objetos PSCredential padrão e funciona bem para manter seus segredos protegidos e criptografados em seus scripts.
Conclusão
O BITS é uma maneira fantástica de controlar as transferências de arquivos entre servidores e entre servidores da web. Com a capacidade de suspender e retomar, é fácil controlar a transferência de arquivos entre links de rede, mesmo aqueles que precisam ser moderados devido ao custo potencial.
Publicidade
Apesar de funcionar apenas no Windows, o BITS é uma ferramenta poderosa para se integrar aos seus scripts e controlar com precisão as transferências de arquivos, mesmo durante reinicializações. Potencialmente substituindo utilitários tradicionais do Windows como Robocopy, o BITS adere à metodologia PowerShell e com a capacidade de transferências em segundo plano como trabalhos, integra-se perfeitamente à automação e scripts existentes.
Nenhum comentário