Frage Native Alternative zu wget in Windows PowerShell?


Ich weiß, dass ich die vorher erwähnte Bibliothek herunterladen und installieren kann (wget für Windows), aber meine Frage ist diese:

In Windows PowerShell gibt es eine native Alternative zu wget?

Ich brauche wget einfach um eine Datei von einer gegebenen URL mit HTTP GET abzurufen. Zum Beispiel:

wget http://www.google.com/

244
2017-11-28 09:56


Ursprung


Siehe auch superuser.com/questions/25538/... - jiggunjer


Antworten:


Hier ist ein einfaches PS 3.0 und späteres One-Liner, das funktioniert und nicht viel PS-Barf beteiligt:

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

Beachten Sie, dass:

  • wget ist ein Alias ​​für Invoke-WebRequest
  • Invoke-WebRequest gibt a zurück HtmlWebResponseObject, die viele nützliche HTML-Parsing-Eigenschaften wie Links, Bilder, Formulare, Eingabefelder usw. enthält, aber in diesem Fall verwenden wir nur den rohen Inhalt
  • Die Dateiinhalte werden vor dem Schreiben auf die Festplatte im Speicher abgelegt, so dass dieser Ansatz für das Herunterladen großer Dateien ungeeignet ist
  • Bei Windows Server Core-Installationen müssen Sie dies als schreiben

    wget http://blog.stackexchange.com/ -UseBasicParsing -OutFile out.html
    
  • Vor dem 20. September 2014 schlug ich vor

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

    als Antwort. Dies funktioniert jedoch nicht in allen Fällen, wie die > Operator (ein Alias ​​für Out-File) konvertiert die Eingabe in Unicode.

Wenn Sie Windows 7 verwenden, müssen Sie Windows Management Framework Version 4 oder neuer installieren.

Sie können das tun a $ProgressPreference = "silentlyContinue" Vor Invoke-WebRequest verbessert die Downloadgeschwindigkeit bei großen Dateien erheblich; Diese Variable steuert, ob die Fortschrittsanzeige wiedergegeben wird.


199
2017-12-26 06:47



Dies ist nun die richtige Antwort und ich habe zufällig wget getesten, wenn ich das tatsächliche wget installiert habe. Ärgerlich, dass es den Dateinamen nicht leicht bekommen kann (Sie müssen es in der Ausgabeumleitung angeben), aber diese Option hat eine bessere Benutzeroberfläche als das echte wget (meiner Meinung nach), also gibt es das. - Matthew Scharley
Aber Windows 7 kommt nur mit PowerShell 2.0, und das Ergebnis wird lauten "Der Begriff 'Invoke-WebRequest' wird nicht als der Name eines Cmdlet erkannt, ...". - Peter Mortensen
Fair-Warnung: Diese Methode speichert den gesamten Inhalt der Datei, bevor sie in die Datei geschrieben wird. Dies ist keine gute Lösung zum Herunterladen großer Dateien. - im_nullable
@im_nullable, guter Ruf - Ich habe das zum Beitrag hinzugefügt. - Warren Rumak
@dezza Ich habe die Antwort mit einem anderen Ansatz aktualisiert. Versuche es noch einmal. - Warren Rumak


Wenn Sie nur eine Datei abrufen müssen, können Sie die verwenden Download-Datei Methode der WebClient Objekt:

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

Woher $url ist eine Zeichenfolge, die die URL der Datei darstellt, und $path repräsentiert den lokalen Pfad, in dem die Datei gespeichert wird.

Beachten Sie, dass $path muss den Dateinamen enthalten; Es kann nicht nur ein Verzeichnis sein.


169
2017-11-28 10:20



Bisher war dies die beste vorgeschlagene Lösung. Auch wenn es scheint, dass ich es in einem Zeilenformat als neu schreiben kann (new-object System.Net.WebClient).DownloadFile( '$url, $path) es ist die beste Korrespondenz für wget Ich habe es bisher gesehen. Vielen Dank! - jsalonen
Als Nebenbemerkung können Sie dies auch asynchron mit etwas wie (new-object System.Net.WebClient) .DownloadFileAsync (url, filePath) - James
Können wir einen bestimmten Text per Webclient und outout auf einen Notizblock holen? Vielen Dank - Mowgli
Ja, das funktioniert direkt auf Windows 7 (das kommt mit PowerShell 2.0). Probe: $client.DownloadFile( "http://blog.stackexchange.com/", "c:/temp2/_Download.html") - Peter Mortensen
Um nur eine URL zu erhalten und die Ergebnisse zu ignorieren (z. B. einen Teil eines IIS-Warmup-Skripts), verwenden Sie DownloadData: (new-object System.Net.WebClient).DownloadData($url) | Out-Null - BurnsBA


Es gibt Invoke-WebRequest in der kommenden PowerShell-Version 3:

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

81
2017-08-10 23:38



die ganze Eleganz von dd... - gWaldo
@gWaldo du machst Witze - das ist eine Freude zu benutzen (Sprechen als jemand, der gerade PS lernt) - Jack Douglas
Ich meine nur, dass das -Outfile Parameter scheint überflüssig zu sein, wenn Sie einfach verwenden könnten > (zum überschreiben) oder >> (anhängen) an eine Datei. - gWaldo
@gWaldo oder folge einfach den Dateinamen aus der URL wget tut :) - Peltier
Und ab PS 4.0, wget und curl werden umgeleitet Invoke-WebRequest (iwr) Standardmäßig: D - Bob


Es ist ein bisschen chaotisch, aber da ist es dieser Blogbeitrag Hier finden Sie Anweisungen zum Herunterladen von Dateien.

Alternativ (und das würde ich empfehlen) können Sie BITS verwenden:

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

Es wird der Fortschritt angezeigt und die Datei wird in das aktuelle Verzeichnis heruntergeladen.


16
2017-11-28 10:18



BITS stützt sich auf die Unterstützung auf dem Server. Wenn dies möglich ist, funktioniert dies im Hintergrund und Sie können Fortschritts-Updates mit anderen Cmdlets erhalten. - Richard
Ich habe versucht zu holen google.de, aber alles was ich bekomme ist Start-BitsTransfer : Access is denied. (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED)). Ich bin verwirrt: | - jsalonen
@jsalonen Ich denke, dass BITS nur Dateien statt Seiten herunterladen wird. Wie Richard sagt, es stützt sich auf einige serverseitige Unterstützung (obwohl ich nicht denke, dass es Microsoft spezifisch ist). - Matthew Steeples
Ich sehe, und ich denke, ich verstehe es, BITS zu benutzen, aber es ist nicht das, wonach ich hier suche. - jsalonen
Ich muss mich daran erinnern. Vielen Dank! - flickerfly


PowerShell V4 Einliner:

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

oder

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

Das ist im Grunde genommen Warrens (genialer) V3 One-Liner  (Danke dafür!) - mit nur einer winzigen Änderung, damit es in einer V4 PowerShell funktioniert.

Warrens One-Liner - die einfach verwendet wget eher, als iwr - sollte noch funktionieren V3 (Zumindest, denke ich; habe es aber nicht getestet). Sowieso. Aber wenn Sie versuchen, es in einem auszuführen V4 PowerShell (wie ich es versucht habe), PowerShell kann nicht aufgelöst werden wget als gültiges Cmdlet / Programm.

Für diejenigen, die interessiert sind, das ist - wie ich abgeholt habe Bobs Kommentar als Antwort auf die akzeptierte Antwort  (Danke, Mann!) - weil ab PowerShell V4, wget und curl sind Aliasing zu Invoke-WebRequest, einstellen iwr standardmäßig. So, wgetkann nicht gelöst werden (ebenso gut wie curl kann hier nicht funktionieren).


6
2018-05-25 10:22





Hier ist eine PowerShell-Funktion, die kurze URLs vor dem Herunterladen der Datei auflöst

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
        }  
    }  
}  

Verwenden Sie es wie folgt, um die Datei in den aktuellen Ordner zu laden:

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

Oder um die Datei in einen bestimmten Ordner herunterzuladen:

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

4
2017-08-12 10:48





Die folgende Funktion erhält eine 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)
}

Einige Kommentare:

  1. Die letzten 4 Zeilen werden nur benötigt, wenn Sie sich hinter einem authentifizierenden Proxy befinden. Für den einfachen Gebrauch, (New-Object Net.WebClient).DownloadFile($url, $path) funktioniert gut.
  2. Der Weg Muss absolut sein, da der Download nicht in Ihrem aktuellen Verzeichnis erfolgt, so dass relative Pfade dazu führen, dass der Download irgendwo verloren geht.
  3. Das if (!$path) {...} Der Abschnitt behandelt den einfachen Fall, in dem Sie die Datei nur unter Verwendung des in der URL angegebenen Namens in das aktuelle Verzeichnis herunterladen möchten.

2
2017-12-15 15:26