Native alternative zu wget in Windows PowerShell?

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

Gibt es in Windows PowerShell eine native Alternative zu wget?

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

wget http://www.google.com/
Author: eyecatchUp, 2011-11-28

11 answers

Hier ist ein einfacher PS 3.0 und späterer Einzeiler, der funktioniert und nicht viel PS barf beinhaltet:

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 HTML-Analyseeigenschaften wie Links, Bilder, Formulare, Eingabefelder usw. enthält., aber in diesem Fall verwenden wir nur den Rohinhalt
  • Der Dateiinhalt wird im Speicher gespeichert, bevor er auf die Festplatte geschrieben wird. der Ansatz ist für das Herunterladen großer Dateien ungeeignet. [15]}
  • Bei Windows Server Core-Installationen müssen Sie dies als

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

    (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 neuer der Windows-Verwaltung installieren Rahmen.

Sie können feststellen, dass das Ausführen eines $ProgressPreference = "silentlyContinue" vor Invoke-WebRequest die Downloadgeschwindigkeit bei großen Dateien erheblich verbessert; Diese Variable steuert, ob die Fortschritts-Benutzeroberfläche gerendert wird.

 274
Author: Warren Rumak,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2018-02-13 06:14:42

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)

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

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

 190
Author: Traveling Tech Guy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2016-04-29 16:46:49

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

Invoke-WebRequest http://www.google.com/ -OutFile c:\google.html
 93
Author: user4514,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2016-04-29 16:48:39

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

Alternativ (und dies ist eine, die ich empfehlen würde) 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.

 19
Author: Matthew Steeples,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2011-11-28 10:18:36

PowerShell V4 Einzeiler:

(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 winzigen Änderung, damit es in einer V4 PowerShell funktioniert.

Warrens Einzeiler - der einfach wget anstelle von iwr - sollte immer noch für und funktionieren (Zumindest denke ich; habe es jedoch nicht getestet). Wie dem auch sei. Aber beim Versuch, es in einem V4 PowerShell (wie ich versucht habe), sehen Sie, dass PowerShell wget nicht als gültiges Cmdlet/Programm auflöst.

Für Interessierte ist das - wie ich von Bobs Kommentar als Antwort auf die akzeptierte Antwort (danke, Mann!) - weil ab PowerShell V4, wget und curl mit einem Alias versehen sind Invoke-WebRequest, standardmäßig auf iwr gesetzt. Somit kann wget nicht aufgelöst werden (sowie curl kann hier nicht funktionieren).

 7
Author: eyecatchUp,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2017-03-20 10:16:54

Hier ist eine PowerShell-Funktion, die kurze URLs auflöst, bevor die Datei heruntergeladen wird

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 so, um die Datei in den aktuellen Ordner herunterzuladen:

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
Author: user25986,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2015-04-24 19:42:15

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 die einfache Verwendung funktioniert (New-Object Net.WebClient).DownloadFile($url, $path) einwandfrei.
  2. Der Pfad muss absolut sein, da der Download nicht in Ihrem aktuellen Verzeichnis erfolgt, sodass relative Pfade dazu führen, dass der Download irgendwo verloren geht.
  3. Der Abschnitt if (!$path) {...} behandelt den einfachen Fall, in dem Sie die Datei nur in das aktuelle Verzeichnis herunterladen möchten verwenden des in der URL angegebenen Namens.
 2
Author: Paul Moore,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2014-12-15 15:26:13

Wenn Ihr Windows neu genug ist (wie Version 1809 oder neuer), ist eine "echte" Curl verfügbar. curl hat die Befehlszeilenoption "- O " (Großbuchstabe O; kleiner Buchstabe macht nicht dasselbe!) Die Option "-O", alternativ "--remote-name" teilt curl mit, dass die gespeicherte Datei den gleichen Namen wie der Dateinamenteil der URL erhält.

Man muss dies als "curl.exe", um es vom Alias "curl" für "Invoke-WebRequest"zu unterscheiden. Übrigens funktioniert es in cmd.exe-Datei, ohne Anpassungen.

Mit dem gleichen Beispiel wie in einer anderen Antwort hier

curl.exe -O http://demo.mediacore.tv/files/31266.mp4

(Die Seite erlaubt mir nicht, dies als Kommentar hinzuzufügen, da ich anscheinend mehr "Reputation" dafür brauche - also bekommt es eine neue Antwort)

 2
Author: Dweia,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2019-03-04 13:25:33

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

 1
Author: Miloud Eloumri,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2018-01-12 10:08:08

Invoke-WebRequest-mit -outfile-parameter erwartet einen string, also, wenn Ihr Dateiname beginnt mit einer Reihe, und nicht in Anführungszeichen eingeschlossen ist, wird keine Ausgabe-Datei erstellt.

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

Dies wirkt sich nicht auf Dateinamen aus, die mit einem Buchstaben beginnen.

 0
Author: Zimba,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2019-03-23 15:21:31

Dies sollte für Sie funktionieren, um das ohne Browser initialisierte Zeug zu umgehen. Beachten Sie den Parameter "-UseBasicParsing".

Invoke-WebRequest http://localhost -UseBasicParsing
 -1
Author: Joe Healy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2019-04-27 20:13:44