Get-WebFile 3.6 (modification of post by Joel Bennett view diff)
diff | embed code: <script type="text/javascript" src="http://PoshCode.org/embed/417"></script>download | new post
An upgrade to my wget script which can output the downloaded html to the pipeline. Get-WebFile can download text or binary files, automatically determine file names, and present a progress report for large files…
- ## Get-WebFile (aka wget for PowerShell)
- ##############################################################################################################
- ## Downloads a file or page from the web
- ## History:
- ## v3.6 - Add -Passthru switch to output TEXT files
- ## v3.5 - Add -Quiet switch to turn off the progress reports ...
- ## v3.4 - Add progress report for files which don't report size
- ## v3.3 - Add progress report for files which report their size
- ## v3.2 - Use the pure Stream object because StreamWriter is based on TextWriter:
- ## it was messing up binary files, and making mistakes with extended characters in text
- ## v3.1 - Unwrap the filename when it has quotes around it
- ## v3 - rewritten completely using HttpWebRequest + HttpWebResponse to figure out the file name, if possible
- ## v2 - adds a ton of parsing to make the output pretty
- ## added measuring the scripts involved in the command, (uses Tokenizer)
- ##############################################################################################################
- function Get-WebFile {
- param(
- $url = (Read-Host "The URL to download"),
- $fileName = $null,
- [switch]$Passthru,
- [switch]$quiet
- )
- $req = [System.Net.HttpWebRequest]::Create($url);
- $res = $req.GetResponse();
- if($fileName -and !(Split-Path $fileName)) {
- $fileName = Join-Path (Get-Location -PSProvider "FileSystem") $fileName
- }
- elseif((!$Passthru -and ($fileName -eq $null)) -or (($fileName -ne $null) -and (Test-Path -PathType "Container" $fileName)))
- {
- [string]$fileName = ([regex]'(?i)filename=(.*)$').Match( $res.Headers["Content-Disposition"] ).Groups[1].Value
- $fileName = $fileName.trim("\/""'")
- if(!$fileName) {
- $fileName = $res.ResponseUri.Segments[-1]
- $fileName = $fileName.trim("\/")
- if(!$fileName) {
- $fileName = Read-Host "Please provide a file name"
- }
- $fileName = $fileName.trim("\/")
- if(!([IO.FileInfo]$fileName).Extension) {
- $fileName = $fileName + "." + $res.ContentType.Split(";")[0].Split("/")[1]
- }
- }
- $fileName = Join-Path (Get-Location -PSProvider "FileSystem") $fileName
- }
- if($Passthru) {
- $encoding = [System.Text.Encoding]::GetEncoding( $res.CharacterSet )
- [string]$output = ""
- }
- if($res.StatusCode -eq 200) {
- [int]$goal = $res.ContentLength
- $reader = $res.GetResponseStream()
- if($fileName) {
- $writer = new-object System.IO.FileStream $fileName, "Create"
- }
- [byte[]]$buffer = new-object byte[] 4096
- [int]$total = [int]$count = 0
- do
- {
- $count = $reader.Read($buffer, 0, $buffer.Length);
- if($fileName) {
- $writer.Write($buffer, 0, $count);
- }
- if($Passthru){
- $output += $encoding.GetString($buffer,0,$count)
- } elseif(!$quiet) {
- $total += $count
- if($goal -gt 0) {
- Write-Progress "Downloading $url" "Saving $total of $goal" -id 0 -percentComplete (($total/$goal)*100)
- } else {
- Write-Progress "Downloading $url" "Saving $total bytes..." -id 0
- }
- }
- } while ($count -gt 0)
- $reader.Close()
- if($fileName) {
- $writer.Flush()
- $writer.Close()
- }
- if($Passthru){
- $output
- }
- }
- $res.Close();
- if($fileName) {
- ls $fileName
- }
- }
Submit a correction or amendment below (click here to make a fresh posting)
After submitting an amendment, you'll be able to view the differences between the old and new posts easily.
PowerShell Code Repository