Cómo descargar un archivo con PowerShell

PowerShell es un excelente lenguaje de secuencias de comandos para escribir todo tipo de secuencias de comandos.

Pero, ¿sabía que también puede descargar un archivo con PowerShell? Puede usar PowerShell para descargar uno o varios archivos de Internet.

Hay 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 por credenciales.

archivo de descarga powershell

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.

Archivo de descarga de Powershell desde URL

Vamos a empezar con la forma más habitual de descargar un archivo desde una URL con PowerShell.

Para ello, utilizaremos el Invoke-WebRequest cmdlet. Para descargar un archivo necesitamos conocer la URL de origen y dar un destino para el archivo que queremos descargar.

El parámetro -OutFile es requerido. No necesita ingresar la ruta completa, pero 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 $dest

Invoke-WebRequest sobrescribirá el archivo local si ya existe sin ninguna advertencia

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 una secuencia de comandos que deberá ejecutarse automáticamente, deberá almacenar las credenciales en la secuencia de comandos.

Recomiendo crear una contraseña de cadena segura y almacenarla en un archivo de texto en la computadora que ejecuta el script.

Todavía no será súper seguro, pero es un poco mejor que usar una contraseña de texto sin formato en su secuencia de comandos.

# 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 $credObject

Descargue 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 usar 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 escribirse en el disco.

Una forma mejor y más rápida es usar el cmdlet Start-BitsTransfer en PowerShell. Este cmdlet le permite poner en cola los archivos, establecer la prioridad (útil para la limitación del ancho de banda), puede ejecutarse en segundo plano y descargar varios archivos de forma asíncrona.

Este es el método más básico para descargar un archivo con BitsTransfer, solo necesita una fuente 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 configurando la prioridad del trabajo:

  • Primer plano: predeterminado
  • Alto
  • Normal
  • Bajo

Solo se usa el ancho de banda inactivo de la red cuando establece la prioridad en alta, normal o baja.

Otra opción es ejecutar el trabajo de descarga. asincrónico, lo que le permite iniciar varios trabajos de descarga al mismo tiempo.

Cuando utiliza este método, asegúrese de completar el trabajo de descarga cuando termine.

Start-BitsTransfer -Source $url -Destination $dest -Asynchronous -Priority normal

Como puede ver, he descargado 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-BitsTransfer

Descarga de varios archivos con PowerShell

Para descargar varios archivos con PowerShell, primero debemos saber qué archivos están disponibles. Podemos usar primero el cmdlet Invoke-WebRequest para obtener el contenido de la página web.

Si echas un vistazo al contenido de http://speed.transip.nl luego verá una lista de archivos binarios que podemos descargar.

Primero, vamos a raspar el sitio web

$content = Invoke-WebRequest -URI "http://speed.transip.nl"

Esto devolverá no solo el contenido de la página web, sino también otras propiedades, como enlaces y campos de entrada.

descargar archivos de url con PowerShell

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 simple consulta similar y seleccionar solo la propiedad href de cada enlace.

$randomBinFiles = $content.links | where {$_.innerHTML -like 'random*'} | select href

Entonces ahora tenemos los enlaces para todos los archivos binarios aleatorios. Todo lo que tenemos que hacer es descargar cada uno de ellos.

Cuando necesite descargar varios archivos, es mejor utilizar el Transferencia de bits de inicio cmdlet. Le permite descargar varios archivos simultáneamente en segundo plano con el parámetro -Asynchronous

Otras ventajas del cmdlet BitsTransfer es que puede manejar las 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-BitsTransfer

Podemos iniciar todos los trabajos de descarga usando el parámetro:Asynchronous. Sin él, el cmdlet de BitsTransfer descarga el primer archivo por completo antes de iniciar la siguiente descarga y, mientras tanto, pone su secuencia de comandos en espera.

powershell descarga varios archivos de url

Puede usar 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 en función de 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 usa BitsTransfer en combinación con el Asynchronous parámetro.

Cuando se usa Asíncrono, crea un archivo temporal durante el proceso de descarga. Pero para usar el archivo, deberá ejecutar el siguiente cmdlet:

Get-BitsTransfer | Complete-BitsTransfer

PowerShell Descargar archivo del servidor

No usaremos Invoke-WebRequest para descargar archivos de una fuente de red local, como un servidor o NAS, con PowerShell.

En cambio, podemos simplemente usar el cmd Copy-Item para descargar un archivo de 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 -Recurse

Si desea obtener más información sobre el cmdlet Copy-Item, debe leer este artículo donde explico más sobre el cmdlet y las alternativas.

Descargar archivo zip de Powershell

El método para descargar archivos zip es prácticamente el mismo que el de un archivo normal.

Pero quería mostrarte cómo descarga y extrae el archivo zip. De esta manera, puede procesar inmediatamente los archivos dentro del archivo zip sin interacción manual.

voy a usar 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 $zipFile

El 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 en 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)

Terminando

Descargar archivos con PowerShell es bastante fácil cuando tiene la URL exacta del archivo de origen.

Cuando primero necesita raspar un sitio web, puede ser un poco más de trabajo configurarlo correctamente.

Intente usar el cmdlet Start-BitsTransfer para descargar archivos y establezca la prioridad en normal cuando lo use en un script de uso automático.

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 puede descargar un archivo con PowerShell, deje un comentario a continuación.

Otros artículos relacionados

Cómo crear un nuevo usuario local con PowerShell

Cómo crear un nuevo usuario local con PowerShell

Cuando necesite crear un usuario local en Windows 10 u 11, puede usar el panel de control de Cuentas de ...
Leer Más
Get-ADComputer- Cómo encontrar y exportar computadoras AD PowerShell

Get-ADComputer- Cómo encontrar y exportar computadoras AD PowerShell

¿Necesita exportar todas las computadoras desde una unidad organizativa o buscar una computadora en su Active Directory? ¿O quieres contar ...
Leer Más
Buzón: cambie la configuración del buzón con PowerShell

Buzón: cambie la configuración del buzón con PowerShell

El cmdlet Set-Mailbox en PowerShell nos permite cambiar la configuración del buzón en Exchange Server y Exchange Online. Podemos usar ...
Leer Más
Cómo descargar un archivo con PowerShell

Cómo descargar un archivo con PowerShell

PowerShell es un excelente lenguaje de secuencias de comandos para escribir todo tipo de secuencias de comandos. Pero, ¿sabía que ...
Leer Más
Cómo agregar o configurar MailboxFolderPermission con PowerShell

Cómo agregar o configurar MailboxFolderPermission con PowerShell

En Exchange Online podemos compartir buzones completos con otros usuarios. Pero, ¿qué sucede si desea compartir solo una carpeta? ¿O ...
Leer Más
Cómo usar Start-Process en PowerShell

Cómo usar Start-Process en PowerShell

Para ejecutar una aplicación, proceso o secuencia de comandos desde PowerShell, simplemente puede ingresar la ruta al archivo. Pero esto ...
Leer Más

Deja un comentario