| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647 |
- <#
- .SYNOPSIS
- Downloads a given uri and saves it to outputFile
- .DESCRIPTION
- Downloads a given uri and saves it to outputFile
- PARAMETER uri
- The uri to fetch
- .PARAMETER outputFile
- The outputh file path to save the uri
- #>
- param(
- [Parameter(Mandatory = $true)]
- $uri,
- [Parameter(Mandatory = $true)]
- $outputFile
- )
- [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
- $ProgressPreference = 'SilentlyContinue' # Don't display the console progress UI - it's a huge perf hit
- $maxRetries = 5
- $retries = 1
- while($true) {
- try {
- Write-Host "GET $uri"
- Invoke-WebRequest $uri -OutFile $outputFile
- break
- }
- catch {
- Write-Host "Failed to download '$uri'"
- $error = $_.Exception.Message
- }
- if (++$retries -le $maxRetries) {
- Write-Warning $error -ErrorAction Continue
- $delayInSeconds = [math]::Pow(2, $retries) - 1 # Exponential backoff
- Write-Host "Retrying. Waiting for $delayInSeconds seconds before next attempt ($retries of $maxRetries)."
- Start-Sleep -Seconds $delayInSeconds
- }
- else {
- Write-Error $error -ErrorAction Continue
- throw "Unable to download file in $maxRetries attempts."
- }
- }
- Write-Host "Download of '$uri' complete, saved to $outputFile..."
|