PowerShell Wget: Télécharger des fichiers facilement

Vous devez télécharger des fichiers depuis le web mais détestez cliquer plusieurs fois sur les liens ? Si votre travail implique de télécharger régulièrement des fichiers depuis le web, vous voudrez probablement automatiser cette tâche. Pourquoi ne pas utiliser PowerShell pour télécharger des fichiers de manière similaire à wget PowerShell ?

Windows PowerShell et PowerShell disposent de capacités de téléchargement de fichiers. Utiliser PowerShell pour télécharger des fichiers consiste à savoir quels cmdlets et classes .NET utiliser et comment les utiliser.

Dans cet article, vous apprendrez les différentes façons d’utiliser PowerShell pour télécharger des fichiers depuis le web.

Prérequis

Étant donné que cet article est un article d’apprentissage pratique, il y a quelques prérequis pour vous assurer de pouvoir suivre les exemples. Voici les exigences de base.

  • A computer that is running on Windows 10 or higher. This computer is where you will run the scripts/commands featured in this article.
  • Windows PowerShell 5.1 ou PowerShell 7.1 (recommandé).
    • Windows 10 inclut déjà Windows PowerShell 5.1.
  • A web site that hosts the files to download.
    • Pour les téléchargements de fichiers non authentifiés, envisagez d’utiliser le site Tele2 Speedtest, qui est gratuit.
    • Si vous souhaitez tester les téléchargements de fichiers avec une autorisation, vous devrez peut-être créer votre propre serveur de fichiers HTTP. Un exemple de serveur de fichiers HTTP gratuit est HFS by Rejetto.

Utilisation de PowerShell pour télécharger des fichiers à partir d’URL : quatre méthodes

Il existe quatre méthodes pour utiliser PowerShell afin de télécharger des fichiers sans dépendre d’outils tiers. Ce sont les suivantes :

  • Invoke-WebRequest
  • Invoke-RestMethod
  • Start-BitsTransfer
  • Classe WebClient .NET.

Quelle que soit la méthode que vous utilisez parmi ces quatre méthodes, la logique et les composants pour les faire fonctionner sont les mêmes. Il doit y avoir une URL source pointant vers l’emplacement du fichier et le chemin de destination pour enregistrer les fichiers téléchargés. Si nécessaire par le serveur web, vous devez également saisir les informations d’identification.

Les sections suivantes montrent chacune de ces quatre méthodes. En fin de compte, c’est à vous de décider de la manière dont vous adapteriez lorsque vous utilisez PowerShell pour télécharger des fichiers.

Utilisation de Invoke-WebRequest comme alternative wget PowerShell

La première méthode dans PowerShell pour télécharger des fichiers est en utilisant le Invoke-WebRequest cmdlet. Peut-être le cmdlet le plus utilisé dans cet article, Invoke-WebRequest, peut télécharger des liens HTTP, HTTPS et FTP.

Que l’emplacement source nécessite que les utilisateurs se connectent ou non, le cmdlet Invoke-WebRequest peut également gérer les demandes avec des informations d’identification.

Pour télécharger un fichier, la syntaxe ci-dessous montre les paramètres minimum requis pour obtenir le résultat souhaité.

Invoke-WebRequest -Uri <source> -OutFile <destination>

Par exemple, le code ci-dessous télécharge un fichier avec le nom 10MB.zip depuis un site web. Ensuite, il enregistre le fichier téléchargé dans C:\dload\10MB.zip. Vous pouvez copier le code ci-dessous et le coller dans votre session PowerShell pour le tester.

# Emplacement du fichier source
$source = 'http://speedtest.tele2.net/10MB.zip'
# Destination pour enregistrer le fichier
$destination = 'c:\dload\10MB.zip'
#Télécharger le fichier
Invoke-WebRequest -Uri $source -OutFile $destination

La démonstration ci-dessous montre le résultat attendu après l’exécution du code ci-dessus dans PowerShell. Comme vous pouvez le voir, le téléchargement du fichier a été réussi.

PowerShell wget : Downloading a file using Invoke-WebRequest

Que se passe-t-il si la source nécessite une authentification avant de permettre l’accès ? Par exemple, le code ci-dessous télécharge un fichier d’un site web privé où les utilisateurs doivent se connecter.

$source = 'https://mirror.lzex.ml/100MB.zip'
$destination = 'c:\dload\100MB.zip'
Invoke-WebRequest -Uri $source -OutFile $destination

Cependant, le téléchargement a échoué en raison d’un accès non autorisé.

Downloading failed due to unauthorized access

Si une authentification est requise, vous devriez ajouter des informations d’identification à la requête en utilisant le paramètre -Credential. La première ligne du code ci-dessous vous invite à entrer les informations d’identification (nom d’utilisateur et mot de passe) et les stocke dans la variable $credential.

$credential = Get-Credential
$source = 'https://mirror.lzex.ml/100MB.zip'
$destination = 'c:\dload\100MB.zip'
Invoke-WebRequest -Uri $source -OutFile $destination -Credential $credential

La démonstration ci-dessous montre ce à quoi vous devez vous attendre lorsque vous exécutez le code ci-dessus dans PowerShell. Comme vous pouvez le voir, le cmdlet Get-Credential a provoqué une demande d’informations d’identification PowerShell. Cette fois, l’utilisation des informations d’identification avec Invoke-WebRequest a abouti à un téléchargement réussi.

Downloading a file with authentication

Lié : Utilisation du Cmdlet PowerShell Get-Credential et tout ce qui concerne les informations d’identification

Faites attention aux erreurs d’analyse lors de l’utilisation de Invoke-WebRequest

A crucial thing to remember when using Invoke-WebRequest in Windows PowerShell is that, by default, this cmdlet uses the Internet Explorer engine to parse data. The error below may happen when using Invoke-WebRequest on computers without the Internet Explorer in it.

Vous devrez émettre à nouveau votre commande, mais cette fois, incluez l’interrupteur -UseBasicParsing.

Invoke-WebRequest -Uri <source> -OutFile <destination> -UseBasicParsing

En PowerShell de Windows, vous pouvez recevoir un message d’erreur : Le contenu de la réponse ne peut pas être analysé car le moteur Internet Explorer n’est pas disponible, ou la configuration de première exécution d’Internet Explorer n’est pas complète. Spécifiez le paramètre UseBasicParsing et réessayez.

À partir de PowerShell Core 6.0, la cmdlet Invoke-WebRequest utilise uniquement une analyse de base. En tant que tel, le paramètre -UseBasicParsing n’est plus nécessaire.

Utilisation de Invoke-RestMethod

La cmdlet Invoke-RestMethod concerne davantage l’envoi d’une requête HTTP ou HTTPS à un service web RESTful. Cette cmdlet est plus adaptée pour les requêtes qui interagissent avec des API REST telles que Microsoft Graph API.

Lorsqu’il s’agit de télécharger des fichiers directement depuis le web, Invoke-RestMethod est un excellent concurrent. Ne vous laissez pas tromper en pensant le contraire. Il n’y a pas beaucoup de différence entre l’utilisation de Invoke-RestMethod et Invoke-WebRequest lorsqu’ils sont utilisés pour télécharger des fichiers à partir d’un lien web direct.

Télécharger un fichier avec Invoke-RestMethod

Pour télécharger un fichier avec Invoke-RestMethod, utilisez la syntaxe ci-dessous. Vous remarquerez que la commande utilise les mêmes paramètres que Invoke-WebRequest.

Invoke-RestMethod -Uri <source> -OutFile <destination>

Dans le code exemple ci-dessous, le fichier est téléchargé à partir de la valeur URL dans la variable $source. Ensuite, il est enregistré dans le chemin défini dans la variable $destination.

$source = 'http://speedtest.tele2.net/10MB.zip'
$destination = 'c:\dload\10MB.zip'
Invoke-RestMethod -Uri $source -OutFile $destination

Si la source nécessite une authentification, vous pouvez transmettre les informations d’identification en utilisant le paramètre -Credential. L’exemple ci-dessous demande les informations d’identification et les stocke dans la variable $credential. La valeur de la variable $credential est ensuite transmise au paramètre -Credential.

De plus, étant donné que le lien du fichier est une source HTTP et non HTTPS, cela signifie que vous envoyez une authentification non chiffrée. En général, vous devriez éviter d’utiliser des sources HTTP pour des raisons de sécurité. Cependant, si vous devez utiliser une source HTTP, vous devez ajouter l’option -AllowUnencryptedAuthentication à votre commande.

$credential = Get-Credential
$source = 'http://speedtest.tele2.net/10MB.zip'
$destination = 'c:\dload\10MB.zip'
Invoke-RestMethod -Uri $source -OutFile $destination -Credential $credential -AllowUnencryptedAuthentication

Utilisation de Start-BitsTransfer

Start-BitsTransfer est spécialement conçu pour le transfert de fichiers entre des ordinateurs clients et serveurs. Cette cmdlet PowerShell dépend du Background Intelligent Transfer Service (BITS) qui est natif du système d’exploitation Windows.

Parce que Start-BitsTransfer nécessite que BITS fonctionne, cela signifie que cette cmdlet n’est pas disponible sur les ordinateurs non-Windows. D’un autre côté, Start-BitsTransfer bénéficie des avantages de BITS lui-même. Certains de ces avantages sont:

  • Sensibilisation à la bande passante et à l’utilisation du réseau.
  • Gestion des interruptions (reprise, auto-reprise, pause, etc.)
  • Téléchargement de plusieurs fichiers en tant que travaux en arrière-plan.
  • Capacité à définir les priorités des travaux de téléchargement.

Téléchargement d’un fichier

La manière fondamentale d’utiliser Start-BitsTransfer dans PowerShell pour télécharger un fichier est de spécifier une source et une destination. En utilisant le script ci-dessous, vous avez seulement besoin de changer les valeurs de $source et $destination selon vos besoins.

$source = 'http://speedtest.tele2.net/100MB.zip'
$destination = 'c:\dload\100MB.zip'
Start-BitsTransfer -Source $source -Destination $destination

Comme vous pouvez le voir dans la démo ci-dessous, le fichier est téléchargé dans le chemin c:\dload\100MB.zip.

Downloading a file using Start-BitsTransfer

Supposez que la destination n’est pas spécifiée, Start-BitsTransfer télécharge et sauvegarde le fichier dans le répertoire de travail actuel. Par exemple, si vous exécutez Start-BitsTransfer depuis C:\dload, le fichier est téléchargé dans le même répertoire.

Pour les téléchargements nécessitant une authentification, Start-BitsTransfer dispose d’un paramètre -Credential qui accepte un objet PSCredential.

Téléchargement de plusieurs fichiers

Pour démontrer le téléchargement de plusieurs fichiers, vous aurez besoin de créer un fichier CSV avec deux colonnes. Nommez le fichier filelist.txt. La première colonne doit contenir le lien vers la source, tandis que la deuxième colonne doit contenir le chemin de destination. Le contenu du fichier ressemblerait à celui ci-dessous.

# source,destination
http://speedtest.tele2.net/1MB.zip,c:\dload\1MB.zip
http://speedtest.tele2.net/10MB.zip,c:\dload\10MB.zip
http://speedtest.tele2.net/100MB.zip,c:\dload\100MB.zip

Connexe: Gestion des fichiers CSV en PowerShell avec Import-Csv

Une fois que le fichier CSV est prêt, utilisez la commande ci-dessous pour commencer le téléchargement du fichier. La commande importe le fichier CSV en utilisant Import-Csv et transmet le contenu à Start-BitsTransfer.

Import-Csv .\filelist.csv | Start-BitsTransfer

Référez-vous à la démo ci-dessous pour voir comment fonctionne le code ci-dessus. Comme vous pouvez le voir, le téléchargement commence et vous pouvez suivre la progression du téléchargement. L’invite PowerShell n’est pas disponible pendant le processus de téléchargement.

Starting a synchronous multiple file download

Supposons que vous souhaitiez démarrer le processus de téléchargement en arrière-plan. Pour ce faire, vous devez simplement ajouter le commutateur -Asynchronous à la fin de la commande Start-BitsTransfer.

Import-Csv .\filelist.csv | Start-BitsTransfer -Asynchronous

Initialement, l’état de chaque tâche montrerait la connexion. La capture d’écran ci-dessous montre l’identifiant de chaque tâche de téléchargement de fichier.

Starting file download as background jobs

Maintenant que vous avez démarré le processus de téléchargement, vous voudrez vérifier si le téléchargement a été terminé. Pour vérifier l’état de la tâche de téléchargement, utilisez la cmdlet Get-BitsTransfer. Comme vous pouvez le voir ci-dessous, l’état des tâches de téléchargement est passé à Transferred.

Viewing the file download job status

Utilisation de la classe WebClient et de la classe HttpClient (.NET Framework)

PowerShell est basé sur .NET, et sa nature lui permet de tirer parti de la puissance de .NET lui-même. Il existe deux classes .NET que vous pouvez utiliser dans PowerShell pour télécharger des fichiers ; WebClient et HttpClient.

Si vous souhaitez en savoir plus sur ces deux classes .NET d’une manière plus développement et technique, vous pourriez commencer par → Quand utiliser WebClient vs. HttpClient vs. HttpWebRequest. Dans la section suivante, vous apprendrez comment utiliser WebClient et HttpClient en PowerShell pour télécharger des fichiers depuis le web.

Téléchargement d’un fichier en utilisant System.Net.WebClient

Pour utiliser la classe WebClient, vous devez initialiser un objet en tant que type System.Net.WebClient. Dans l’exemple ci-dessous, le $webClient est le nouvel objet System.Net.WebClient. Ensuite, en utilisant la méthode DownloadFile(), vous démarrez le téléchargement du fichier à partir de la source.

Connexe: Utilisation des accélérateurs de types de données PowerShell pour accélérer le codage

Veuillez copier le code ci-dessous et l’exécuter dans votre session PowerShell pour tester. Notez que vous ne verrez aucun progrès ou sortie à l’écran sauf s’il y a une erreur. Cependant, l’invite PowerShell sera verrouillée jusqu’à ce que le téléchargement soit terminé.

# Définir le lien source et le chemin de destination
$source = 'http://speedtest.tele2.net/10MB.zip'
$destination = 'c:\dload\10MB.zip'
# Créer le nouveau WebClient
$webClient = [System.Net.WebClient]::new()
# Télécharger le fichier
$webClient.DownloadFile($source, $destination)

Si la source nécessite une authentification pour autoriser le téléchargement du fichier, vous pouvez utiliser le code ci-dessous. La première ligne demande les informations d’identification et les stocke dans la variable $credentials. La valeur de $credential est ensuite incluse dans la demande de téléchargement du fichier.

# Demande de nom d'utilisateur et de mot de passe
$credentials = Get-Credential
$source = 'http://speedtest.tele2.net/10MB.zip'
$destination = 'c:\dload\10MB.zip'
# Création du nouveau WebClient
$webClient = [System.Net.WebClient]::new()
# Ajout des informations d'identification
$webClient.Credentials = $credentials
# Téléchargement du fichier
$webClient.DownloadFile($source, $destination)

Selon ce document Microsoft: « Nous ne recommandons pas d’utiliser la classe WebClient pour un nouveau développement. Utilisez plutôt la classe System.Net.Http.HttpClient. »

Il semble que la classe WebClient soit obsolète et que la nouvelle classe recommandée par Microsoft soit la classe HttpClient. Ne vous inquiétez pas, cependant. La prochaine section explique comment utiliser la classe HttpClient en PowerShell pour télécharger des fichiers depuis le web.

Téléchargement d’un fichier à l’aide de System.Net.Http.HttpClient

Tout comme la classe WebClient, vous devez d’abord créer le System.Net.Http.HttpClient. En utilisant le code ci-dessous, le fichier est téléchargé depuis la $source vers la $destination. Référez-vous aux commentaires au-dessus de chaque ligne pour savoir ce que fait chaque ligne de code.

Le code ci-dessous est en direct, et vous pouvez le tester en l’exécutant dans votre session PowerShell.

# Définir la source et la destination
$source = 'http://speedtest.tele2.net/10MB.zip'
$destination = 'c:\dload\10MB.zip'
 
# Créer la demande de téléchargement du client HTTP
$httpClient = New-Object System.Net.Http.HttpClient
$response = $httpClient.GetAsync($source)
$response.Wait()
 
# Créer un flux de fichier pointant vers le fichier de destination
$outputFileStream = [System.IO.FileStream]::new($destination, [System.IO.FileMode]::Create, [System.IO.FileAccess]::Write)
 
# Diffuser le téléchargement vers le flux de fichier de destination
$downloadTask = $response.Result.Content.CopyToAsync($outputFileStream)
$downloadTask.Wait()
 
# Fermer le flux de fichier
$outputFileStream.Close()

Dans les situations où le téléchargement d’un fichier nécessite une authentification, vous devez ajouter les informations d’identification à l’objet HttpClient. Pour inclure des informations d’identification dans la demande de téléchargement de fichier, créez un nouvel objet System.Net.Http.HttpClientHandler pour stocker les informations d’identification.

Vous pouvez copier le code ci-dessous et l’exécuter dans PowerShell pour le tester. Ou vous pouvez également l’exécuter en tant que script PowerShell. Dans cet exemple, le code est enregistré sous le nom de download-file.ps1.

# Définir la source et la destination
$source = 'http://speedtest.tele2.net/10MB.zip'
$destination = 'c:\dload\10MB.zip'
 
# Demander des informations d'identification
$credentials = Get-Credential

# Créer la demande de téléchargement du client HTTP avec des informations d'identification
$handler = New-Object System.Net.Http.HttpClientHandler
$handler.Credentials = $credentials
$httpClient = New-Object System.Net.Http.HttpClient($handler)
$response = $httpClient.GetAsync($source)
$response.Wait()
 
# Créer un flux de fichier pointant vers le fichier de destination
$outputFileStream = [System.IO.FileStream]::new($destination, [System.IO.FileMode]::Create, [System.IO.FileAccess]::Write)
 
# Diffuser le téléchargement vers le flux de fichier de destination
$downloadTask = $response.Result.Content.CopyToAsync($outputFileStream)
$downloadTask.Wait()
 
# Fermer le flux de fichier
$outputFileStream.Close()

La démo ci-dessous montre le résultat lors de l’exécution du script PowerShell pour télécharger le fichier.

Au départ, le répertoire ne contient que le fichier de script. Il y a une invite pour entrer le nom d’utilisateur et le mot de passe. Ensuite, le script procède au téléchargement du fichier. Après avoir téléchargé le fichier, vous pouvez voir que le nouveau fichier se trouve maintenant dans le répertoire de destination.

Downloading a file using the .NET HttpClient class

Conclusion

Windows PowerShell et PowerShell Core sont dotés de capacités intégrées pour télécharger des fichiers, agissant comme une alternative à PowerShell wget! Que vous téléchargiez des sources protégées par mot de passe, un seul fichier ou plusieurs fichiers, une méthode PowerShell est disponible pour vous.

Les méthodes de téléchargement de fichiers couvertes dans cet article fonctionnent à la fois sur Windows PowerShell et PowerShell Core. Cela signifie que ces méthodes s’appliquent à la fois aux systèmes Windows et non Windows, à l’exception de Start-BitsTransfer.

Et comme PowerShell est plus qu’une invite de commande, vous pouvez traduire ce que vous avez appris en scripts. Pour vous, cela signifie une opportunité d’automatisation. Plus besoin de copier des URL, de cliquer sur des liens et d’attendre les téléchargements manuellement.

Source:
https://adamtheautomator.com/powershell-download-file/