J'utilise la méthode Invoke-WebRequest
De Powershell pour télécharger un fichier d'Amazon S3 vers mon instance Windows EC2.
Si je télécharge le fichier à l'aide de Chrome, je peux télécharger un fichier de 200 Mo en 5 secondes. Le même téléchargement dans PowerShell en utilisant Invoke-WebRequest
Prend jusqu'à 5 minutes.
Pourquoi l'utilisation de Invoke-WebRequest
Est-elle plus lente et existe-t-il un moyen de télécharger à pleine vitesse dans un script PowerShell?
J'utilisais
Invoke-WebRequest $video_url -OutFile $local_video_url
J'ai changé ce qui précède en
$wc = New-Object net.webclient
$wc.Downloadfile($video_url, $local_video_url)
Cela a restauré la vitesse de téléchargement à ce que je voyais dans mes navigateurs.
Sans quitter Invoke-WebRequest, désactiver la barre de progression l'a fait pour moi. J'ai trouvé la réponse à partir de ce fil: https://github.com/PowerShell/PowerShell/issues/2138 (jasongin a commenté le 3 octobre 2016)
$ProgressPreference = 'SilentlyContinue'
Invoke-WebRequest <params>
Pour mon fichier de 5 Mo sur localhost, le temps de téléchargement est passé de 30 à 250 ms.
Notez que pour récupérer la barre de progression dans le shell actif, vous devez appeler $ProgressPreference = 'Continue'
.
Je viens de frapper ce problème aujourd'hui, si vous changez l'argument ContentType en application/octet-stream c'est beaucoup plus rapide (aussi rapide que l'utilisation de webclient). La raison en est que la commande Invoke-Request ne tentera pas d'analyser la réponse au format JSON ou XML.
Invoke-RestMethod -ContentType "application/octet-stream" -Uri $video_url -OutFile $local_video_url
Je suppose que le raisonnement derrière lequel Invoke-WebRequest est plus lent est son analyse de style de grattage de la page que vous demandez, tandis que le client Web .NET émet simplement une demande d'obtention et enregistre la réponse.
Invoke-WebRequest analyse les propriétés Content, ParsedHtml, Forms, InputFields, Links, Images, Scripts, AllElements, BaseResponse et StatusCode.
Assez bien article sur le grattage avec Invoke-WebRequest.