Preface
If you have ever used the PowerShell cmdlet Invoke-WebRequest to download content, you might have observed that it is terribly slow. Files that typically download within seconds with any web browser or tools such as curl or wget, can take minutes to complete with PowerShell.
Solution
The reason that Invoke-WebRequest often is slow because it shows a progress bar when it downloads files. For some odd reason, this causes a major overhead for PowerShell, causing performance degradation.
To disable the progress bar, we only have to add a simple statement in our script before using it. The statement is $ProgressPreference = 'SilentlyContinue'
To provide a complete code example, here we download docker-compose.exe with this fix.
$dockerComposeFolder = "C:\Program Files\Docker"
if (-not (Test-Path $dockerComposeFolder)) { mkdir $dockerComposeFolder }
$url = "https://github.com/docker/compose/releases/download/v2.20.3/docker-compose-windows-x86_64.exe"
$ProgressPreference = 'SilentlyContinue'
Invoke-WebRequest -UseBasicParsing $url -o $Env:ProgramFiles\Docker\docker-compose.exe
This should improve the speed of your scripts considerably when using Invoke-WebRequest.
