Download file with progress

Thanks to Jason Niver on MSDN Blogs (Downloading files from the internet in PowerShell (with progress)), yep, we can download a file from the web and display progress (bytes and percentage).

Function Get-Webfile ($url)
{
	$dest=(Join-Path $pwd.Path $url.SubString($url.LastIndexOf('/')))
	Write-Host "Downloading $url`n" -ForegroundColor DarkGreen;
	$uri=New-Object "System.Uri" "$url"
	$request=[System.Net.HttpWebRequest]::Create($uri)
	$request.set_Timeout(5000)
	$response=$request.GetResponse()
	$totalLength=[System.Math]::Floor($response.get_ContentLength()/1024)
	$length=$response.get_ContentLength()
	$responseStream=$response.GetResponseStream()
	$destStream=New-Object -TypeName System.IO.FileStream -ArgumentList $dest, Create
	$buffer=New-Object byte[] 10KB
	$count=$responseStream.Read($buffer,0,$buffer.length)
	$downloadedBytes=$count
	while ($count -gt 0)
		{
		[System.Console]::CursorLeft=0
		[System.Console]::Write("Downloaded {0}K of {1}K ({2}%)", [System.Math]::Floor($downloadedBytes/1024), $totalLength, [System.Math]::Round(($downloadedBytes / $length) * 100,0))
		$destStream.Write($buffer, 0, $count)
		$count=$responseStream.Read($buffer,0,$buffer.length)
		$downloadedBytes+=$count
		}
	Write-Host ""
	Write-Host "`nDownload of `"$dest`" finished." -ForegroundColor DarkGreen;
	$destStream.Flush()
	$destStream.Close()
	$destStream.Dispose()
	$responseStream.Dispose()
}

Leave a Reply

Scroll to Top