2011-11-28 09:56:40 +0000 2011-11-28 09:56:40 +0000
293
293

Native Alternative zu wget in Windows PowerShell?

Ich weiß, dass ich die oben genannte Bibliothek (wget für Windows) herunterladen und installieren kann, aber meine Frage ist folgende:

Gibt es in Windows PowerShell eine native Alternative zu wget?

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

wget http://www.google.com/

Antworten (11)

243
243
243
2013-12-26 06:47:06 +0000

Hier ist ein einfacher Einzeiler für PS 3.0 und höher, der funktioniert und nicht viel PS-Kotze beinhaltet:

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

Beachten Sie, dass:

  • wget ein Alias für Invoke-WebRequest
  • Invoke-WebRequest gibt ein HtmlWebResponseObject zurück, das viele nützliche Eigenschaften für die HTML-Analyse wie Links, Bilder, Formulare, InputFields usw. enthält, aber in diesem Fall verwenden wir nur den Rohinhalt
  • Der Dateiinhalt wird vor dem Schreiben auf die Festplatte im Arbeitsspeicher gespeichert, was diesen Ansatz für das Herunterladen großer Dateien ungeeignet macht
  • Auf Windows Server Core-Installationen müssen Sie dies als

schreiben - Vor dem 20. September 2014 schlug ich vor

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

Möglicherweise werden Sie feststellen, dass die Ausführung von $ProgressPreference = "silentlyContinue" vor Invoke-WebRequest die Download-Geschwindigkeit bei großen Dateien erheblich verbessert; diese Variable steuert, ob die Fortschritts-UI gerendert wird.

186
186
186
2011-11-28 10:20:08 +0000

Wenn Sie nur eine Datei abrufen müssen, können Sie die Methode DownloadFile des Objekts WebClient 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.

88
88
88
2012-08-10 23:38:18 +0000

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

Invoke-WebRequest http://www.google.com/ -OutFile c:\google.html
18
18
18
2011-11-28 10:18:36 +0000

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

Alternativ (und das 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.

6
6
6
2014-05-25 10:22:13 +0000

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 Warren’s (awesome) V3 Einzeiler (danke dafür! ) - mit nur einer winzigen Änderung, damit es in einer V4 PowerShell funktioniert. Warrens Einzeiler - die einfach wget statt iwr verwendet - sollte immer noch für V3 funktionieren (zumindest denke ich das; habe es aber nicht getestet). Wie auch immer. Aber wenn Sie versuchen, es in einer V4 PowerShell auszuführen (wie ich es versucht habe), werden Sie sehen, dass PowerShell wget nicht als gültiges Cmdlet/Programm auflösen kann.

Für diejenigen, die es interessiert, das heißt - wie ich aus Bobs Kommentar in Antwort auf die akzeptierte Antwort (danke, Mann!) entnommen habe - weil wie bei der PowerShell V4, wget und curl mit Invoke-WebRequest aliasisiert sind, standardmäßig auf iwr gesetzt. Daher kann wget nicht aufgelöst werden (so wie curl hier nicht funktionieren kann).

4
4
4
2014-08-12 10:48:51 +0000

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(' 


Verwenden Sie sie wie folgt, um die Datei in den aktuellen Ordner herunterzuladen: 

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
```)) {
                $destination += $filename
            } else {
                $destination += ' 


Verwenden Sie sie wie folgt, um die Datei in den aktuellen Ordner herunterzuladen: 

&001 


Oder um die Datei in einen angegebenen Ordner herunterzuladen: 

&001 + $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 sie wie folgt, um die Datei in den aktuellen Ordner herunterzuladen:

&001

Oder um die Datei in einen angegebenen Ordner herunterzuladen:

&001

2
2
2
2014-12-15 15:26:13 +0000

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 Anmerkungen:

  1. Die letzten 4 Zeilen werden nur benötigt, wenn Sie sich hinter einem authentifizierenden Proxy befinden. Zur einfachen Verwendung funktioniert (New-Object Net.WebClient).DownloadFile($url, $path) gut.
  2. Der Pfad 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. Der Abschnitt if (!$path) {...} behandelt den einfachen Fall, dass Sie die Datei nur in das aktuelle Verzeichnis unter Verwendung des in der URL angegebenen Namens herunterladen wollen.
1
1
1
2017-09-27 03:21:03 +0000

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: Running Bash on Ubuntu on Windows! Windows Subsystem for Linux Documentation

0
0
0
2018-11-27 18:05:22 +0000

Invoke-WebRequest mit dem Parameter -outfile erwartet eine Zeichenfolge. Wenn Ihr Dateiname also mit einer Zahl beginnt und nicht in Anführungszeichen eingeschlossen ist, wird keine Ausgabedatei erstellt.

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

Dies hat keine Auswirkungen auf Dateinamen, die mit einem Buchstaben beginnen.

0
0
0
2019-03-04 13:25:33 +0000

Wenn Ihr Windows neu genug ist (wie z.B. Version 1809 oder neuer), ist ein “echter” Curl verfügbar. curl hat die Befehlszeilenoption “-O” (Großbuchstabe O; Kleinbuchstaben tun nicht dasselbe! ) Die Option “-O”, alternativ “–remote-name” teilt curl mit, daß die gespeicherte Datei den gleichen Namen erhält wie der Dateinamen-Teil der URL.

Man muß diese als “curl.exe” starten, um sie vom Alias “curl” für “Invoke-WebRequest” zu unterscheiden. Übrigens funktioniert es in cmd.exe ohne Änderungen.

Unter Verwendung des gleichen Beispiels wie in einer anderen Antwort hier

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

(Die Site erlaubt mir nicht, dies als Kommentar hinzuzufügen, da ich dafür offenbar mehr “Reputation” benötige - sie bekommt also eine neue Antwort)

-1
-1
-1
2019-04-27 20:13:44 +0000

Dies sollte für Sie funktionieren, um das “kein Browser” initialisierte Zeug zu umgehen. Beachten Sie den Param. “-UseBasicParsing” Param.

Invoke-WebRequest http://localhost -UseBasicParsing