Cómo descargar un archivo con PowerShell
PowerShell es un excelente lenguaje de programación para escribir todo tipo de secuencias de comandos. ¿Pero sabías que también puedes descargar un archivo con PowerShell? Puede utilizar PowerShell para descargar uno o varios archivos de Internet.
Existen un par de métodos cuando se trata de descargar archivos con PowerShell. Podemos descargar archivos desde cualquier URL con PowerShell, recursos compartidos de red local y desde sitios web protegidos con credenciales.
En este artículo, comenzaremos con el método más sencillo para descargar un solo archivo y también veremos otros métodos (más rápidos) para descargar un archivo con PowerShell.
Powershell Descargar archivo desde URL
Vamos a empezar con la forma más común de descargar un archivo desde una URL con PowerShell. Para esto, usaremos el cmdlet Invoke-WebRequest. Para descargar un archivo necesitamos conocer la URL de origen y proporcionar un destino para el archivo que queremos descargar.
El parámetro -OutFile es obligatorio. No es necesario introducir la ruta completa, pero sí se requiere un nombre de archivo.
# Source URL
$url = "http://speed.transip.nl/10mb.bin"
# Destation file
$dest = "c:\temp\testfiles.bin"
# Download the file
Invoke-WebRequest -Uri $url -OutFile $destInvoke-WebRequest sobrescribirá el archivo local si ya existe sin previo aviso
Autenticación con Invoke-WebRequest
Algunos recursos en línea requieren que inicie sesión antes de poder acceder o descargar los archivos. Con el cmdlet Invoke-WebRequest, podemos proporcionar las credenciales necesarias para descargar los archivos.
Si está creando un script que deberá ejecutarse automáticamente, deberá almacenar las credenciales en el propio script. Recomiendo crear una contraseña de cadena segura y almacenarla en un archivo de texto en la computadora que ejecuta el script. Aún así no será súper seguro, pero es un poco mejor que usar una contraseña de texto plano en tu script.
# URL and Destination
$url = "http://speed.transip.nl/10mb.bin"
$dest = "c:\temp\testfiles"
# Define username and password
$username = 'LazyUsrName'
$password = 'StrongPlainTextPasswd'
# Convert to SecureString
$secPassword = ConvertTo-SecureString $password -AsPlainText -Force
# Create Credential Object
$credObject = New-Object System.Management.Automation.PSCredential ($username, $secPassword)
# Download file
Invoke-WebRequest -Uri $url -OutFile $dest -Credential $credObjectDescargue archivos más rápido con Start-BitsTransfer en PowerShell
El método Invoke-WebRequest está disponible en todas las versiones de PowerShell y también se puede utilizar en máquinas Linux. Pero la desventaja es que es un poco lento. Con Invoke-WebRequest, el archivo se almacena primero en la memoria antes de escribirlo en el disco.
Una forma mejor y más rápida es utilizar el cmdlet Start-BitsTransfer en PowerShell. Este cmdlet le permite poner archivos en cola, establecer prioridades (útil para la limitación del ancho de banda), puede ejecutarse en segundo plano y descargar varios archivos de forma asincrónica.
Este es el método más básico para descargar un archivo con BitsTransfer, solo necesitas un origen y un destino.
# URL and Destination
$url = "http://speed.transip.nl/10mb.bin"
$dest = "c:\temp\testfiles"
# Download file
Start-BitsTransfer -Source $url -Destination $dest De forma predeterminada, los trabajos de descarga se ejecutan en primer plano y consumen el ancho de banda máximo disponible. Puede cambiar esto estableciendo la prioridad del trabajo:
- Primer plano: predeterminado
- Alto
- Normal
- Bajo
Solo se utiliza el ancho de banda de la red inactivo cuando establece la prioridad en alta, normal o baja.
Otra opción es ejecutar el trabajo de descarga asíncrono, lo que le permite iniciar varios trabajos de descarga al mismo tiempo. Cuando utilice este método, asegúrese de completar el trabajo de descarga cuando finalice.
Start-BitsTransfer -Source $url -Destination $dest -Asynchronous -Priority normal
Como puede ver, descargué el mismo archivo bin que antes. Pero si miramos en la carpeta de destino solo vemos un archivo .tmp.
Deberá ejecutar Complete-BitsTransfer para finalizar el trabajo de descarga.
Get-BitsTransfer | Complete-BitsTransferDescarga de varios archivos con PowerShell
Para descargar varios archivos con PowerShell primero necesitamos saber qué archivos están disponibles. Primero podemos usar el cmdlet Invoke-WebRequest para obtener el contenido de la página web.
Si echas un vistazo al contenido de http://speed.transip.nl verás una lista de archivos binarios que podemos descargar.
Primero, vamos a eliminar el sitio web.
$content = Invoke-WebRequest -URI "http://speed.transip.nl"Esto devolverá no sólo el contenido de la página web sino también otras propiedades, como Links y InputFields.
Esta es una página web bastante simple, pero digamos que solo queremos los archivos que comienzan con el nombre "aleatorio". Podemos filtrar los enlaces con una consulta simple y seleccionar solo la propiedad href de cada enlace.
$randomBinFiles = $content.links | where {$_.innerHTML -like 'random*'} | select hrefAhora tenemos los enlaces para todos los archivos binarios aleatorios. Lo único que debemos hacer es descargar cada uno de ellos.
Cuando necesite descargar varios archivos, es mejor utilizar el cmdlet Start-BitsTransfer. Te permite descargar múltiples archivos simultáneamente en segundo plano con el parámetro -Asynchronous
Otras ventajas del cmdlet BitsTransfer es que puede manejar interrupciones de conexión y es consciente del uso del ancho de banda de su red.
$url = "http://speed.transip.nl"
# Create full links for each entry
$randomBinFiles.foreach( { $_.href = $url + "/" + $_.href })
# Download each file in the background
$randomBinFiles.foreach({
Start-BitsTransfer ($url + "/" + $_.href) -Asynchronous
})
# Complete the BitsTransfer
Get-BitsTransfer | Complete-BitsTransferPodemos iniciar todos los trabajos de descarga utilizando el parámetro -Asynchronous. Sin él, el cmdlet BitsTransfer descarga el primer archivo por completo antes de iniciar la siguiente descarga y, mientras tanto, pone el script en espera.
Puede utilizar el cmdlet Get-BitTransfer para mostrar el progreso de la descarga. Si desea detener el trabajo de descarga, utilice el cmdlet Remove-BitTransfer. Puede detener un solo trabajo según su JobId o todos los trabajos con:
Get-BitsTransfer | % {Remove-BitsTransfer $_.JobId}Completa la descarga de BitsTransfer
Es importante completar el archivo transferido cuando se utiliza BitsTransfer en combinación con el parámetro Asynchronous. Cuando se utiliza Asynchronous, se crea un archivo temporal durante el proceso de descarga. Pero para utilizar realmente el archivo necesitarás ejecutar el siguiente cmdlet:
Get-BitsTransfer | Complete-BitsTransferPowerShell Descargar archivo desde el servidor
No usaremos Invoke-WebRequest para descargar archivos desde una fuente de red local, como un servidor o NAS, con PowerShell. En su lugar, podemos simplemente usar el cmd Copy-Item para descargar un archivo desde un servidor.
El cmdlet Copy-Items toma un origen y un destino, al igual que el cmdlet Invoke-WebRequest.
# Set Source and destination
$source = "\\LA-WIN10-LAB01\speedtest\"
$destination = "c:\temp\testfiles"
# Copy all items in the source folder
Copy-Item -path $source -Destination $destination -RecurseSi desea saber más sobre el cmdlet Copy-Item, debería leer este artículo donde explico más sobre el cmdlet y sus alternativas.
Powershell Descargar archivo zip
El método para descargar archivos zip es prácticamente el mismo que el de un archivo normal. Pero quería mostrarles cómo se descarga y extrae el archivo zip. De esta manera, puede procesar inmediatamente los archivos dentro del archivo zip sin interacción manual.
Voy a utilizar este csv de muestra en GitHub que podemos descargar en un archivo zip. Tenemos que establecer un destino para el archivo zip y una ruta donde queremos extraer los archivos.
Invoke-WebRequest descarga el archivo zip como cualquier otro archivo.
# URL and Destination
$url = "https://github.com/datapackage-examples/sample-csv/archive/refs/heads/master.zip"
# Create temp destination for the zip and get zipfile name from source URL
$zipFile = "c:\temp\zipfiles" + $(Split-Path -Path $Url -Leaf)
# Extract path
$extractPath = "c:\temp\zipfiles"
# Download file
Invoke-WebRequest -Uri $url -OutFile $zipFileEl siguiente paso es extraer el archivo zip automáticamente en la ubicación deseada. Para ello vamos a utilizar un objeto COM. Con el objeto COM podemos extraer el archivo zip y copiar el contenido a la ubicación deseada.
# Create instance of COM Object
$objShell = New-Object -ComObject Shell.Application
# Extract the Files
$extractedFiles = $ObjShell.NameSpace($zipFile).Items()
# Copy the extracted files to the destination folder
$ObjShell.NameSpace($extractPath).CopyHere($extractedFiles)Concluyendo
Descargar archivos con PowerShell es bastante fácil cuando tienes la URL exacta del archivo fuente. Cuando primero necesita eliminar un sitio web, configurarlo correctamente puede requerir un poco más de trabajo.
Intente utilizar el cmdlet Start-BitsTransfer para descargar archivos y establezca la prioridad en normal cuando lo utilice en un script autónomo. BitsTransfer tiene más opciones cuando se trata de reintentos, reanudación y control de ancho de banda que Invoke-WebRequest.
Si tiene alguna pregunta sobre cómo descargar un archivo con PowerShell, deje un comentario a continuación.



