Una característica menos conocida de Windows es el Servicio de transferencia inteligente en segundo plano (BITS). Este es un servicio, principalmente para programadores y administradores de sistemas, que funciona para transferir archivos hacia y desde servidores HTTP y SMB.
Estas son algunas de las características increíblemente útiles de este servicio:
- Manejar las interrupciones de la red
- Pausar y reanudar, inclusive desde un reinicio
- Tenga en cuenta el costo de la red
En este post, exploramos cómo utilizar BITS en PowerShell para realizar y controlar las operaciones de transferencia de archivos.
Introducción a BITS
los Cmdlets BITS en realidad están integrados como comandos de PowerShell predeterminados. Podemos ver cuáles son esos comandos ejecutando Get-Command | Where-Object Source -EQ 'BitsTransfer'
.
Aún cuando PowerShell 7 es multiplataforma, se basa en un servicio específico de Windows, por lo que esta funcionalidad no estará disponible en otros sistemas operativos.
Transferencia de bits de inicio
Para crear un nuevo trabajo de transferencia de BITS, al que después puede agregar o borrar archivos, use el Start-BitsTransfer
cmdlet. Para transferir archivos simplemente entre dos ubicaciones, puede establecer un origen y un destino como se muestra a continuación.
$Params = @{
"Source" = 'Server01C$TestFile.txt'
"Destination" = 'Server02C$TestFile.txt'
}
Start-BitsTransfer @Params
Para aprovechar los otros cmdlets de BITS, es mejor darle al trabajo de transferencia de BITS un DisplayName
que después se puede hacer referencia más adelante. Usando el mismo @Params
declaración, podemos agregar un nombre para mostrar, en esta circunstancia TestTransfer
.
Start-BitsTransfer @Params -DisplayName 'TestTransfer'
De forma predeterminada, la transferencia de BITS se ejecutará a Foreground
prioridad, lo que implica la mayor velocidad de transferencia disponible. Esto se puede cambiar fácilmente usando una de las prioridades disponibles que se enumeran a continuación.
- Primer plano (predeterminado): transfiere el trabajo con la prioridad más alta y compite por los recursos de red con otras aplicaciones.
- Elevado: Transfiere con una prioridad más alta de lo normal, pero aún depende del uso del ancho de banda inactivo de la red del equipo cliente.
- Normal: Igual que la prioridad alta pero con una prioridad más baja.
- Bajo: Igual que la prioridad normal pero con la prioridad más baja factible. Start-BitsTransfer @Params -DisplayName ‘TestTransfer’ -Priority ‘Normal’
Como se mencionó al principio, BITS tiene la capacidad única de prestar atención el costo de la red. Para hacer esto, usamos el TransferPolicy
parámetro.
$Params = @{
"Source" = 'Server01C$TestFile.txt'
"Destination" = 'Server02C$TestFile.txt'
"DisplayName" = 'TestTransfer'
"Priority" = 'Normal'
"TransferPolicy" = 'Capped'
}
Start-BitsTransfer @Params
En este ejemplo, Capped
implica que hay un límite superior para el tráfico de la red y respetar ese límite.
Para terminar, para iniciar este trabajo en segundo plano y devolver nuestra consola para su uso, pasando el Asynchronous
El parámetro nos posibilita poner en segundo plano el trabajo.
Start-BitsTransfer @Params -Asynchronous
Get-BitsTransfer
¿Y si quisiéramos chequear todos los trabajos de BITS en ejecución? Get-BitsTransfer
cmdlet.
Desde que nombramos nuestra transferencia con TestTransfer
antes, es fácil de hallar. Corriendo Get-BitsTransfer
por sí solo mostrará una lista de todos los trabajos en ejecución.
Add-BitsFile
Ahora que hemos recuperado nuestra transferencia, podemos agregar archivos adicionales a esta transferencia simplemente llamando Add-BitsFile
.
$Job = Get-BitsTransfer -Name 'TestTransfer'
$Params = @{
"Source" = 'Server01C$TestFile2.txt'
"Destination" = 'Server02C$TestFile2.txt'
}
$Job | Add-BitsFile @Params
Suspend-BitsTransfer
Con todos estos archivos transfiriéndose, a veces es necesario pausar una transferencia. Esto puede ocurrir por muchas razones. A menudo, se debe a una red congestionada o un sistema debe reiniciarse en medio de una transferencia. Esto es simple con BITS, usando el Suspend-BitsTransfer
funcionalidad.
$Job | Suspend-BitsTransfer
Transferencia de bits de currículum
Naturalmente, en alguna vez tendremos que comenzar el trabajo nuevamente, y nuevamente es tan simple como pasar el trabajo a Resume-BitsTransfer
.
$Job | Resume-BitsTransfer
Transferencia de bits
Si un trabajo aún está activo, es factible actualizar el trabajo con una nueva configuración usando el Set-BitsTransfer
cmdlet. En el siguiente ejemplo, estamos configurando el trabajo con la mayor prioridad de red factible. Originalmente configuramos el trabajo para Normal
, pero tenemos que hacer el trabajo antes, por lo tanto usamos Foreground
.
$Job | Set-BitsTransfer -Priority 'Foreground'
Transferencia de bits completos
Tal vez hayamos suspendido un trabajo y estemos listos para finalizar el traspaso. Usando el Complete-BitsTransfer
cmdlet, podemos decirle a BITS que finalice todos los trabajos de transferencia activos.
Get-BitsTransfer | Complete-BitsTransfer
Transferencia de bits
Para terminar, si solo necesitamos borrar un trabajo, en ejecución o no, podemos utilizar el Remove-BitsTransfer
cmdlet.
Get-BitsTransfer -Name "JobToBeRemoved" | Remove-BitsTransfer -Confirm:$False
Usando -Confirm:$False
, significa que los trabajos se eliminarán sin una solicitud de confirmación.
Capacidades adicionales de BITS
Los ejemplos que se muestran en los procesos anteriores se concentraron en la descarga de un archivo de un servidor a otro. BITS además tiene la capacidad de cargar un archivo, inclusive con autenticación.
$Params = @{
"Source" = 'Server01C$TestFile.txt'
"Destination" = '<http://server02/uploaddir/testfile.txt>'
"TransferType" = 'Upload'
}
Start-BitsTransfer @Params
Es esencial prestar atención que el comportamiento predeterminado de BITS es descargar varios archivos automáticamente. Este no es el mismo comportamiento con la carga y, para evitar esta limitación, puede canalizar varios archivos al Start-BitsTransfer
cmdlet.
Si el servidor de destino está protegido por autenticación, puede especificar el tipo, como Basic
, Digest
, NTLM
, Negotiate
, o Passport
usando el Authentication
parámetro. Desde luego, al utilizar la autenticación, deberá pasar una credencial que se puede hacer fácilmente con el Credential
parámetro. Esto necesita estándar PSCredential
objetos y funciona bien para mantener sus secretos seguros y encriptados dentro de sus scripts.
Conclusión
BITS es una forma fantástica de controlar la transferencia de archivos entre servidores y entre servidores web. Con la capacidad de suspender y reanudar, es fácil controlar la transferencia de archivos a través de links de red, inclusive aquellos que deben moderarse debido al costo potencial.
Pese a que esto solo funciona en Windows, BITS es una herramienta poderosa para integrarse en sus scripts y controlar con precisión las transferencias de archivos, inclusive entre reinicios. Potencialmente reemplazando las utilidades tradicionales de Windows como Robocopy, BITS se adhiere a la metodología PowerShell y, con la capacidad de realizar transferencias en segundo plano como trabajos, se integra sin problemas en la automatización y los scripts existentes.