I use Powershell's Invoke-WebRequest
method to download a file from Amazon S3 to my Windows EC2 instance.
If I download the file using Chrome, I am able to download a 200 MB file in 5 seconds. The same download in PowerShell using Invoke-WebRequest
takes up to 5 minutes.
Why is using Invoke-WebRequest
slower and is there a way to download at full speed in a PowerShell script?
The Invoke-WebRequest cmdlet sends HTTP and HTTPS requests to a web page or web service. It parses the response and returns collections of links, images, and other significant HTML elements. This cmdlet was introduced in PowerShell 3.0.
Invoke-RestMethod is perfect for quick APIs that have no special response information such as Headers or Status Codes, whereas Invoke-WebRequest gives you full access to the Response object and all the details it provides.
Without switching away from Invoke-WebRequest, turning off the progress bar did it for me. I found the answer from this thread: https://github.com/PowerShell/PowerShell/issues/2138 (jasongin commented on Oct 3, 2016)
$ProgressPreference = 'SilentlyContinue'
Invoke-WebRequest <params>
For my 5MB file on localhost, the download time went from 30s to 250ms.
Note that to get the progress bar back in the active shell, you need to call $ProgressPreference = 'Continue'
.
I was using
Invoke-WebRequest $video_url -OutFile $local_video_url
I changed the above to
$wc = New-Object net.webclient
$wc.Downloadfile($video_url, $local_video_url)
This restored the download speed to what I was seeing in my browsers.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With