Last active
March 19, 2025 10:20
-
-
Save ChrisStro/37444dd012f79592080bd46223e27adc to your computer and use it in GitHub Desktop.
Get-FileFromWeb | Function to show download progress in powershell
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
function Get-FileFromWeb { | |
param ( | |
# Parameter help description | |
[Parameter(Mandatory)] | |
[string]$URL, | |
# Parameter help description | |
[Parameter(Mandatory)] | |
[string]$File | |
) | |
Begin { | |
function Show-Progress { | |
param ( | |
# Enter total value | |
[Parameter(Mandatory)] | |
[Single]$TotalValue, | |
# Enter current value | |
[Parameter(Mandatory)] | |
[Single]$CurrentValue, | |
# Enter custom progresstext | |
[Parameter(Mandatory)] | |
[string]$ProgressText, | |
# Enter value suffix | |
[Parameter()] | |
[string]$ValueSuffix, | |
# Enter bar lengh suffix | |
[Parameter()] | |
[int]$BarSize = 40, | |
# show complete bar | |
[Parameter()] | |
[switch]$Complete | |
) | |
# calc % | |
$percent = $CurrentValue / $TotalValue | |
$percentComplete = $percent * 100 | |
if ($ValueSuffix) { | |
$ValueSuffix = " $ValueSuffix" # add space in front | |
} | |
if ($psISE) { | |
Write-Progress "$ProgressText $CurrentValue$ValueSuffix of $TotalValue$ValueSuffix" -id 0 -percentComplete $percentComplete | |
} | |
else { | |
# build progressbar with string function | |
$curBarSize = $BarSize * $percent | |
$progbar = "" | |
$progbar = $progbar.PadRight($curBarSize,[char]9608) | |
$progbar = $progbar.PadRight($BarSize,[char]9617) | |
if (!$Complete.IsPresent) { | |
Write-Host -NoNewLine "`r$ProgressText $progbar [ $($CurrentValue.ToString("#.###").PadLeft($TotalValue.ToString("#.###").Length))$ValueSuffix / $($TotalValue.ToString("#.###"))$ValueSuffix ] $($percentComplete.ToString("##0.00").PadLeft(6)) % complete" | |
} | |
else { | |
Write-Host -NoNewLine "`r$ProgressText $progbar [ $($TotalValue.ToString("#.###").PadLeft($TotalValue.ToString("#.###").Length))$ValueSuffix / $($TotalValue.ToString("#.###"))$ValueSuffix ] $($percentComplete.ToString("##0.00").PadLeft(6)) % complete" | |
} | |
} | |
} | |
} | |
Process { | |
try { | |
$storeEAP = $ErrorActionPreference | |
$ErrorActionPreference = 'Stop' | |
# invoke request | |
$request = [System.Net.HttpWebRequest]::Create($URL) | |
$response = $request.GetResponse() | |
if ($response.StatusCode -eq 401 -or $response.StatusCode -eq 403 -or $response.StatusCode -eq 404) { | |
throw "Remote file either doesn't exist, is unauthorized, or is forbidden for '$URL'." | |
} | |
if($File -match '^\.\\') { | |
$File = Join-Path (Get-Location -PSProvider "FileSystem") ($File -Split '^\.')[1] | |
} | |
if($File -and !(Split-Path $File)) { | |
$File = Join-Path (Get-Location -PSProvider "FileSystem") $File | |
} | |
if ($File) { | |
$fileDirectory = $([System.IO.Path]::GetDirectoryName($File)) | |
if (!(Test-Path($fileDirectory))) { | |
[System.IO.Directory]::CreateDirectory($fileDirectory) | Out-Null | |
} | |
} | |
[long]$fullSize = $response.ContentLength | |
$fullSizeMB = $fullSize / 1024 / 1024 | |
# define buffer | |
[byte[]]$buffer = new-object byte[] 1048576 | |
[long]$total = [long]$count = 0 | |
# create reader / writer | |
$reader = $response.GetResponseStream() | |
$writer = new-object System.IO.FileStream $File, "Create" | |
# start download | |
$finalBarCount = 0 #show final bar only one time | |
do { | |
$count = $reader.Read($buffer, 0, $buffer.Length) | |
$writer.Write($buffer, 0, $count) | |
$total += $count | |
$totalMB = $total / 1024 / 1024 | |
if ($fullSize -gt 0) { | |
Show-Progress -TotalValue $fullSizeMB -CurrentValue $totalMB -ProgressText "Downloading $($File.Name)" -ValueSuffix "MB" | |
} | |
if ($total -eq $fullSize -and $count -eq 0 -and $finalBarCount -eq 0) { | |
Show-Progress -TotalValue $fullSizeMB -CurrentValue $totalMB -ProgressText "Downloading $($File.Name)" -ValueSuffix "MB" -Complete | |
$finalBarCount++ | |
#Write-Host "$finalBarCount" | |
} | |
} while ($count -gt 0) | |
} | |
catch { | |
$ExeptionMsg = $_.Exception.Message | |
Write-Host "Download breaks with error : $ExeptionMsg" | |
} | |
finally { | |
# cleanup | |
if ($reader) { $reader.Close() } | |
if ($writer) { $writer.Flush(); $writer.Close() } | |
$ErrorActionPreference = $storeEAP | |
[GC]::Collect() | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Works great, thanks