Alternativa nativa a wget in Windows PowerShell?

So che posso scaricare e installare la libreria di cui sopra (wget for Windows), ma la mia domanda è questa:

In Windows PowerShell, c'è un'alternativa nativa a wget ?

Ho bisogno di wget semplicemente per recuperare un file da un dato URL con HTTP GET. Per esempio:

 wget http://www.google.com/ 

    Ecco un semplice PS 3.0 e successivo one-liner che funziona e non coinvolge molto PS barf:

     wget http://blog.stackexchange.com/ -OutFile out.html 

    Nota che:

    • wget è un alias per Invoke-WebRequest
    • Invoke-WebRequest restituisce un HtmlWebResponseObject che contiene molte properties; di analisi HTML utili come Links, Immagini, Forme, InputFields ecc., Ma in questo caso stiamo usando solo il contenuto grezzo
    • Il contenuto del file viene memorizzato nella memory prima di scrivere su disco, rendendo questo metodo inadatto per il download di file di grandi size
    • Nelle installazioni di Windows Server Core, è necessario scrivere come

       wget http://blog.stackexchange.com/ -UseBasicParsing -OutFile out.html 
    • Prima del 20 settembre 2014, ho suggerito

       (wget http://blog.stackexchange.com/).Content >out.html 

      come risposta. Tuttavia, questo non funziona in tutti i casi, poiché l'operatore > (che è un alias per Out-File ) converte l'input in Unicode.

    Se si utilizza Windows 7, sarà necessario installare una versione più recente di Windows Management Framework. La versione 4 (fornita con Windows 8.1 / 2012 R2) è disponibile qui: http://www.microsoft.com/en-us/download/details.aspx?id=40855

    Se è sufficiente recuperare un file, è ansible utilizzare il metodo DownloadFile dell'object WebClient :

     $client = New-Object System.Net.WebClient $client.DownloadFile($url, $path) 

    Dove $url è una string che rappresenta l'URL del file e $path rappresenta il path locale in cui verrà salvato il file.

    Si noti che il $path deve includere il nome del file; non può essere solo una directory.

    C'è Invoke-WebRequest nella prossima versione 3 di PowerShell:

     Invoke-WebRequest http://www.google.com/ -OutFile c:\google.html 

    E 'un po' disordinato ma c'è questo post sul blog che ti fornisce le istruzioni per il download dei file.

    In alternativa (e questo è uno che mi raccommand) è ansible utilizzare BITS:

     Import-Module BitsTransfer Start-BitsTransfer -source "http://urlToDownload" 

    Esso mostrerà i progressi e scaricherà il file nella directory corrente.

    One-liner PowerShell V4:

     (iwr http://blog.stackexchange.com/).Content >index.html` 

    o

     (iwr http://demo.mediacore.tv/files/31266.mp4).Content >video.mp4 

    Questo è fondamentalmente Warren's (awesome) V3 one-liner (grazie per questo!) – Con solo un piccolo cambiamento per farlo funzionare in un V4 PowerShell.

    Il one-liner di Warren – che usa semplicemente wget piuttosto che iwr – dovrebbe ancora lavorare per V3 (alless, credo, non lo ha provato, però). Comunque. Ma quando provo ad eseguirlo in un V4 PowerShell (come ho provato), vedrai che PowerShell non riesce a risolvere wget come un cmdlet / programma valido.

    Per coloro che sono interessati, cioè – come ho preso dal commento di Bob in risposta alla risposta accettata (grazie, uomo!) – perché da PowerShell V4, wget e curl sono aliasati a Invoke-WebRequest , impostati su iwr per impostazione predefinita . Pertanto, wget non può essere risolto (così come il curl non può funzionare qui) .

    Ecco una function PowerShell che consente di risolvere brevi URL prima di scaricare il file

     function Get-FileFromUri { param( [parameter(Mandatory=$true, Position=0, ValueFromPipeline=$true, ValueFromPipelineByPropertyName=$true)] [string] [Alias('Uri')] $Url, [parameter(Mandatory=$false, Position=1)] [string] [Alias('Folder')] $FolderPath ) process { try { # resolve short URLs $req = [System.Net.HttpWebRequest]::Create($Url) $req.Method = "HEAD" $response = $req.GetResponse() $fUri = $response.ResponseUri $filename = [System.IO.Path]::GetFileName($fUri.LocalPath); $response.Close() # download file $destination = (Get-Item -Path ".\" -Verbose).FullName if ($FolderPath) { $destination = $FolderPath } if ($destination.EndsWith('\')) { $destination += $filename } else { $destination += '\' + $filename } $webclient = New-Object System.Net.webclient $webclient.downloadfile($fUri.AbsoluteUri, $destination) write-host -ForegroundColor DarkGreen "downloaded '$($fUri.AbsoluteUri)' to '$($destination)'" } catch { write-host -ForegroundColor DarkRed $_.Exception.Message } } } 

    Usalo come questo per scaricare il file nella cartella corrente:

     Get-FileFromUri http://example.com/url/of/example/file 

    Oppure per scaricare il file in una cartella specificata:

     Get-FileFromUri http://example.com/url/of/example/file C:\example-folder 

    La function seguente otterrà un URL.

     function Get-URLContent ($url, $path) { if (!$path) { $path = Join-Path $pwd.Path ([URI]$url).Segments[-1] } $wc = New-Object Net.WebClient $wc.UseDefaultCredentials = $true $wc.Proxy.Credentials = $wc.Credentials $wc.DownloadFile($url, $path) } 

    Alcuni commenti:

    1. Le ultime 4 righe sono necessarie solo se si è dietro un proxy di authentication. Per un uso semplice, (New-Object Net.WebClient).DownloadFile($url, $path) funziona bene.
    2. Il path deve essere assoluto, poiché il download non è stato eseguito nella directory corrente, quindi i routes relativi causeranno il download perduto da qualche parte.
    3. La sezione if (!$path) {...} gestisce il semplice caso in cui si desidera scaricare il file nella directory corrente utilizzando il nome specificato nell'URL.