Native Alternative zu Wget in Windows PowerShell?

314152
jsalonen

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

Gibt es in Windows PowerShell eine native Alternative zu wget?

Ich muss wgeteinfach eine Datei mit HTTP GET von einer bestimmten URL abrufen. Zum Beispiel:

wget http://www.google.com/ 
255
Siehe auch http://superuser.com/questions/25538/how-to-download-files-from-command-line-in-windows-like-wget-is-doing jiggunjer vor 8 Jahren 0

9 Antworten auf die Frage

210
Warren Rumak

Hier ist ein einfacher PS 3.0 und neuer One-Liner, der funktioniert und nicht viel PS-Barf benötigt:

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

Beachten Sie, dass:

  • wget ist ein Alias ​​für Invoke-WebRequest
  • Invoke-WebRequest gibt ein HtmlWebResponseObject zurück, das viele nützliche Eigenschaften für die HTML-Analyse enthält, z. B. Links, Bilder, Formulare, InputFields usw. In diesem Fall verwenden wir jedoch nur den unformatierten Inhalt
  • Der Inhalt der Datei wird im Speicher abgelegt, bevor auf die Festplatte geschrieben wird. Daher ist dieser Ansatz für das Herunterladen großer Dateien nicht geeignet
  • 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 habe ich vorgeschlagen

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

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

Wenn Sie Windows 7 verwenden, müssen Sie Version 4 oder höher von Windows Management Framework installieren.

Sie können feststellen, dass ein tun, $ProgressPreference = "silentlyContinue"bevor Invoke-WebRequestdeutlich Download - Geschwindigkeit mit großen Dateien zu verbessern; Diese Variable steuert, ob die Fortschrittsbenutzeroberfläche gerendert wird.

Dies ist jetzt die richtige Antwort, und ich habe wget aus Versehen getestet, ob ich das eigentliche wget installiert habe. Ärgerlich, dass der Dateiname nicht einfach abgerufen werden kann (Sie müssen ihn in der Ausgabeumleitung angeben), aber diese Option hat eine bessere Benutzeroberfläche als die eigentliche Wget (meiner Meinung nach). Matthew Scharley vor 10 Jahren 3
[Windows 7 wird nur mit PowerShell 2.0 geliefert] (http://superuser.com/questions/650814) und das Ergebnis lautet "Der Begriff" Invoke-WebRequest "wird nicht als Name eines Cmdlets erkannt, ... ". Peter Mortensen vor 9 Jahren 13
Powershell 4 ist für Windows 7 verfügbar - es ist Teil des Windows Management Framework. http://www.microsoft.com/de-de/download/details.aspx?id=40855 Warren Rumak vor 9 Jahren 0
Faire Warnung: Diese Methode speichert den gesamten Inhalt der Datei, bevor sie in die Datei geschrieben wird. Dies ist keine gute Lösung für das Herunterladen großer Dateien. im_nullable vor 9 Jahren 14
@im_nullable, guter Anruf - das habe ich dem Beitrag hinzugefügt. Warren Rumak vor 9 Jahren 1
@dezza, was meinst du mit "encoding"? Die Ausgabe ist eine Erfassung des Inhalts, der im Text der HTTP-GET-Antwort gesendet wird, z. B. Binärdateien, HTML oder was immer Sie möchten. Es ist wirklich schwer zu sehen, wie eine .py-Datei "kaputt gehen" kann, wenn sie ihren Rohinhalt von einem Ort an einen anderen kopiert, es sei denn, der Webserver ist derjenige, der zuerst damit zu tun hat ..... Warren Rumak vor 9 Jahren 0
@Warren Versuchen Sie, https://bootstrap.pypa.io/get-pip.py mit dem obigen Befehl auszuführen, und führen Sie es mit Python 2.7 aus. Versuchen Sie dann ein anderes Tool wie wget, und es wird funktionieren. dezza vor 9 Jahren 0
@dezza Ich habe die Antwort mit einem anderen Ansatz aktualisiert. Versuchen Sie es erneut. Warren Rumak vor 9 Jahren 1
@Warren +1 :) besser und kürzer. dezza vor 9 Jahren 0
ps Um etwas zu speichern, können Sie -o eingeben und dann die Tabulatortaste drücken, um die Tabulatorvervollständigung für -OutFile zu erhalten Warren Rumak vor 9 Jahren 0
Vielen Dank. Wissen Sie vielleicht, wie Sie das Kopieren / die Zwischenablage von der PS-Konsole bereinigen können, ohne Blockauswahl zu treffen? Das Kopieren von PS ist irritierend, da fast jeder lange Befehl in der nächsten Zeile ausgeführt wird. dezza vor 9 Jahren 0
Sie können die Ausgabe von Powershell in die Zwischenablage umleiten, indem Sie beispielsweise "Get-PSDrive | clip" ausführen. Beachten Sie, dass die Ausgabe als Unicode umgeschrieben wird. Warren Rumak vor 9 Jahren 0
Außerdem teilt die Konsole in der Powershell-ISE die Auswahllogik der Konsole nicht. Ich schlage vor, dies anstelle der Standard PS-Konsole zu verwenden. Warren Rumak vor 9 Jahren 0
Dies funktioniert nicht, wenn Sie sich hinter einer authentifizierenden Firewall befinden. Sie erhalten einen Fehler "Proxy-Authentifizierung erforderlich". Sie können dies beheben, indem Sie $ wc = New-Object Net.WebClient ausführen. $ wc.UseDefaultCredentials = $ true; $ wc.Proxy.Credentials = $ wc.Credentials`. Sie müssen dies nur einmal pro Sitzung tun, so scheint es. (Ich bin nicht zu 100% sicher, warum dies funktioniert, es sieht so aus, als ob der Proxy ein gemeinsames Objekt auf Sitzungsebene ist ...) Paul Moore vor 9 Jahren 0
Dies verwendet IE, wie alles in Powershell, es wurde auf eine schnelle und schmutzige Weise durchgeführt, anstatt nur Wget oder Curl zu integrieren. Wenn Microsoft dies jedoch tat, würde dies die Lizenzierung ruinieren. Chris S vor 8 Jahren 0
@ChrisS Es wird kein IE verwendet, wenn Sie den Parameter -UseBasicParsing angeben. (Deshalb ist dieser Parameter für Server Core erforderlich) Warren Rumak vor 7 Jahren 0
175
Traveling Tech Guy

Wenn Sie nur eine Datei abrufen müssen, können Sie die DownloadFile- Methode des WebClient- Objekts verwenden:

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

Wo $urlist ein String, der die URL der Datei darstellt, und $pathden lokalen Pfad, in dem die Datei gespeichert wird.

Beachten Sie, dass $pathder Dateiname enthalten sein muss. Es kann nicht nur ein Verzeichnis sein.

Bisher war dies die beste vorgeschlagene Lösung. Angesichts dessen, dass es so aussieht, als könnte ich es in einem Zeilenformat als `(neues-Objekt-System.Net.WebClient) .DownloadFile ('$ url, $ path)' umschreiben.` . Vielen Dank! jsalonen vor 12 Jahren 28
Als Randbemerkung können Sie dies auch asynchron ausführen, indem Sie Folgendes verwenden (new-object System.Net.WebClient) .DownloadFileAsync (url, filePath) James vor 11 Jahren 2
Können wir einen bestimmten Text über Webclient und einen Notizblock abrufen? Vielen Dank Mowgli vor 10 Jahren 0
Ja, dies funktioniert standardmäßig unter Windows 7 ([wird mit PowerShell 2.0 geliefert] (http://superuser.com/questions/650814)). Beispiel: `$ client.DownloadFile (" http://blog.stackexchange.com/ "," c: /temp2/_Download.html ")` Peter Mortensen vor 9 Jahren 5
Warum verwendet dies 100% einer meiner CPUs? Hut8 vor 8 Jahren 0
@jsalonen und da das .NET ist, funktioniert es auf PS 2.0, auf die ich mich momentan beschränke. Nick vor 7 Jahren 0
Um nur eine URL zu erhalten und die Ergebnisse zu ignorieren (z. B. Teil eines IIS-Warmup-Skripts), verwenden Sie DownloadData: `(neues-Objekt System.Net.WebClient) .DownloadData ($ url) | Out-Null` BurnsBA vor 7 Jahren 3
Fehlermeldungen sind sehr wenig hilfreich; Wenn $ path ein Verzeichnis oder eine vorhandene Datei ist, wird eine generische Ausnahme ausgelöst. Ah, Microsoft. BaseZen vor 6 Jahren 0
81
user4514

Invoke-WebRequestIn der kommenden PowerShell-Version 3 ist Folgendes enthalten:

Invoke-WebRequest http://www.google.com/ -OutFile c:\google.html 
die ganze Eleganz von "dd" ... gWaldo vor 11 Jahren 8
@gWaldo Sie machen Witze - das ist eine Freude zu benutzen (spricht als jemand, der gerade PS lernt) Jack Douglas vor 11 Jahren 1
Ich meine damit nur, dass der Parameter `-Outfile` unwichtig erscheint, wenn Sie einfach`> `(zum Überschreiben) oder` >> `(zum Anhängen) an eine Datei verwenden könnten. gWaldo vor 11 Jahren 8
@gWaldo oder leiten sogar den Dateinamen von der URL ab, genau wie `wget` dies tut :) Peltier vor 10 Jahren 5
`Invoke-WebRequest $ url ($ url -split" / ") [- 1]`. Scheitert leider, wenn die URL mit einem Schrägstrich endet. Sollte ziemlich einfach zu verbessern sein. Peltier vor 10 Jahren 0
Und ab PS 4.0 werden "wget" und "curl" standardmäßig mit "Invoke-WebRequest" ("iwr") versehen: D Bob vor 10 Jahren 5
@ Bob Thx, Fühlen Sie sich frei, die Antwort zu bearbeiten und fügen Sie diese Aliasnamen ein! user4514 vor 10 Jahren 0
@gWaldo PowerShell kann recht glatt sein. Sie können die Verknüpfungen `(iwr http://www.google.com/).Content> google.html` oder die Argumente` Invoke-WebRequest -Uri "http://www.google.com" -OutFile google.html verwenden `. Beachten Sie, dass die Pipe in PowerShell eine Objektpipe ist, nicht nur eine Zeichenpipe. Die Ausgabe von Invoke-WebRequest ist also kein Datenstrom, sondern ein Objekt, in dem Sie `.Content verwenden müssen `. Versuchen Sie Folgendes: `$ foo = Invoke-WebRequest http: // www.google.com` und dann $ foo | Get-Member` dann `$ foo.StatusCode` oder` $ foo.Content`. Tyler Szabo vor 7 Jahren 1
Unter Windows 2016 Core / Standard musste ich "-usebasicparsing" übergeben, da es sonst über fehlende Internet Explorer-Engine klagte Adi Roiban vor 6 Jahren 1
16
Matthew Steeples

Es ist ein bisschen chaotisch, aber es gibt diesen Blog-Beitrag, der Ihnen Anweisungen zum Herunterladen von Dateien gibt.

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

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

Es zeigt den Fortschritt an und lädt die Datei in das aktuelle Verzeichnis herunter.

BITS basiert auf der Unterstützung des Servers. Falls verfügbar, funktioniert dies im Hintergrund, und Sie können Statusupdates mit anderen Cmdlets abrufen. Richard vor 12 Jahren 2
Ich habe versucht, http://www.google.com abzurufen, aber alles, was ich bekomme, ist `Start-BitsTransfer: Zugriff wird verweigert. (Ausnahme von HRESULT: 0x80070005 (E_ACCESSDENIED)) `. Ich bin verwirrt: | jsalonen vor 12 Jahren 2
@jsalonen Ich denke, dass BITS nur Dateien und keine Seiten herunterlädt. Wie Richard sagt, ist es auf serverseitige Unterstützung angewiesen (obwohl ich nicht denke, dass es Microsoft-spezifisch ist). Matthew Steeples vor 12 Jahren 1
Ich verstehe und ich glaube, ich verstehe es, wenn ich BITS verwende, aber es ist nicht das, wonach ich hier suche. jsalonen vor 12 Jahren 0
Ich muss mich daran erinnern. Vielen Dank! flickerfly vor 9 Jahren 0
6
eyecatchUp

PowerShell V4 One-Liner:

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

oder

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

Dies ist im Grunde Warrens (awesome) V3-Einzeiler (danke dafür!) - mit nur einer kleinen Änderung, damit es in einer V4 PowerShell funktioniert.

Warrens 1-Liner - der einfach wgeteher als verwendet wird iwr- sollte immer noch für V3 funktionieren (zumindest denke ich; habe es aber nicht getestet). Sowieso. Wenn Sie jedoch versuchen, es in einer V4 PowerShell auszuführen (wie ich es versucht habe), werden Sie wgetfeststellen, dass PowerShell nicht als gültiges Cmdlet / Programm aufgelöst wird.

Für Interessierte ist das - wie ich von Bobs Kommentar als Antwort auf die akzeptierte Antwort (danke, Mann!) - aufgefallen bin , weil seit PowerShell V4 wgetund standardmäßig ein curlAlias ​​auf Invoke-WebRequestgesetzt istiwr . Somit wgetkann nicht aufgelöst werden ( curlkann hier auch nicht funktionieren) .

4
user25986

Hier ist eine PowerShell-Funktion, die vor dem Herunterladen der Datei kurze URLs 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 }  }  }  

So können Sie die Datei in den aktuellen Ordner herunterladen:

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

Oder um die Datei in einen angegebenen Ordner herunterzuladen:

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

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. Funktioniert (New-Object Net.WebClient).DownloadFile($url, $path)problemlos.
  2. Der Pfad muss absolut sein, da der Download nicht in Ihrem aktuellen Verzeichnis erfolgt. Relative Pfade führen dazu, dass der Download irgendwo verloren geht.
  3. In diesem if (!$path) {...}Abschnitt wird der einfache Fall behandelt, in dem Sie die Datei mit dem in der URL angegebenen Namen einfach in das aktuelle Verzeichnis herunterladen möchten.
1
Miloud Eloumri

Verwenden Sie die Windows 10-Bash-Shell, die Wget enthält, sobald die Windows-Funktion eingerichtet ist.

So installieren Sie die Ubuntu-Bash-Shell unter Windows:

YouTube: Bash unter Ubuntu unter Windows ausführen!

Windows-Subsystem für Linux-Dokumentation

Erwägen Sie, dieser Antwort einige zitierte Verweise hinzuzufügen, die das unterstützen, was Sie für den Fall angeben, dass der Link einmal abbricht, sodass der Antwortinhalt noch verfügbar ist und derzeit nur über diesen Link gemäß Ihrem Vorschlag verfügbar ist. Pimp Juice IT vor 6 Jahren 1
-1
zimba

Invoke-WebRequest -Uri "http://www.google.com/" -outfile "2.pdf"

Hinweis: Der Parameter -outfile erwartet eine Zeichenfolge. Wenn Ihr Dateiname mit einer Zahl beginnt und nicht in Anführungszeichen eingeschlossen ist, wird keine Ausgabedatei erstellt.

Dies hat keinen Einfluss auf Dateinamen, die mit einem Buchstaben beginnen.

Diese Lösung wird in anderen Antworten erwähnt (`wget` ist ein Alias ​​von` Invoke-WebRequest` und ähnelt dem obigen). bertieb vor 5 Jahren 0
Der Punkt der Antwort bestand darin, die Notiz zu betonen. In keiner der Antworten geht es darum, dass aufgrund des Syntaxfehlers keine Datei erstellt wurde. zimba vor 5 Jahren 0
Das sollte wirklich ein Kommentar zu den anderen Antworten sein. bertieb vor 5 Jahren 0