PowerShell Wget: Dateien einfach herunterladen

Möchten Sie Dateien aus dem Web herunterladen, aber hassen es, immer wieder auf Links zu klicken? Wenn Ihr Job regelmäßiges Herunterladen von Dateien aus dem Web beinhaltet, möchten Sie wahrscheinlich die Aufgabe automatisieren. Warum verwenden Sie nicht PowerShell, um Dateien ähnlich wie bei „PowerShell wget“ herunterzuladen?

Windows PowerShell und PowerShell verfügen über Datei-Download-Funktionen. Das Herunterladen von Dateien mit PowerShell hängt davon ab, welche Cmdlets und .NET-Klassen verwendet werden und wie sie verwendet werden.

In diesem Artikel erfahren Sie verschiedene Möglichkeiten, wie Sie PowerShell zum Herunterladen von Dateien aus dem Web verwenden können.

Voraussetzungen

Da es sich um einen „Learning-by-Doing“-Artikel handelt, gibt es einige Voraussetzungen, um sicherzustellen, dass Sie den Beispielen folgen können. Hier sind die grundlegenden Anforderungen.

  • A computer that is running on Windows 10 or higher. This computer is where you will run the scripts/commands featured in this article.
  • Windows PowerShell 5.1 oder PowerShell 7.1 (empfohlen).
    • Windows 10 enthält bereits Windows PowerShell 5.1.
  • A web site that hosts the files to download.
    • Für nicht authentifizierte Dateidownloads können Sie die kostenlose Website Tele2 Speedtest verwenden.
    • Wenn Sie Dateidownloads mit Autorisierung testen möchten, müssen Sie möglicherweise Ihren eigenen HTTP-Dateiserver erstellen. Ein Beispiel für einen kostenlosen HTTP-Dateiserver ist HFS by Rejetto.

Verwenden von PowerShell zum Herunterladen von Dateien von URLs: Vier Möglichkeiten

Es gibt vier Methoden, um PowerShell zum Herunterladen von Dateien zu verwenden, die nicht von Drittanbieter-Tools abhängen. Diese sind:

  • Invoke-WebRequest
  • Invoke-RestMethod
  • Start-BitsTransfer
  • .NET WebClient-Klasse.

Egal welche dieser vier Methoden Sie verwenden, die Logik und die Komponenten, um sie zum Laufen zu bringen, sind dieselben. Es muss eine Quell-URL geben, die auf den Speicherort der Datei zeigt, und einen Zielpfad, um die heruntergeladenen Dateien zu speichern. Wenn der Webserver es erfordert, müssen Sie auch die Anmeldeinformationen eingeben.

In den nächsten Abschnitten werden diese vier Methoden gezeigt. Am Ende liegt es an Ihnen zu entscheiden, auf welche Weise Sie PowerShell verwenden, um Dateien herunterzuladen.

Verwendung von Invoke-WebRequest als Alternative zu PowerShell wget

Die erste Methode in PowerShell zum Herunterladen von Dateien besteht darin, das Invoke-WebRequest-Cmdlet zu verwenden. Dieses Cmdlet wird in diesem Artikel am häufigsten verwendet und kann HTTP-, HTTPS- und FTP-Links herunterladen.

Ob der Quellort Benutzer zum Anmelden erfordert, das Invoke-WebRequest-Cmdlet kann auch Anfragen mit Anmeldeinformationen bearbeiten.

Um eine Datei herunterzuladen, zeigt die folgende Syntax die minimalen erforderlichen Parameter, um das gewünschte Ergebnis zu erzielen.

Invoke-WebRequest -Uri <source> -OutFile <destination>

Zum Beispiel lädt der folgende Code eine Datei mit dem Namen 10MB.zip von einer Website herunter. Dann speichert er die heruntergeladene Datei unter C:\dload\10MB.zip. Sie können den folgenden Code kopieren und in Ihre PowerShell-Sitzung einfügen, um ihn zu testen.

# Speicherort der Quelldatei
$source = 'http://speedtest.tele2.net/10MB.zip'
# Ziel zum Speichern der Datei
$destination = 'c:\dload\10MB.zip'
# Datei herunterladen
Invoke-WebRequest -Uri $source -OutFile $destination

Die untenstehende Demonstration zeigt das erwartete Ergebnis nach Ausführung des obenstehenden Codes in PowerShell. Wie Sie sehen können, war der Dateidownload erfolgreich.

PowerShell wget : Downloading a file using Invoke-WebRequest

Wie sieht es aus, wenn für den Zugriff auf die Quelle eine Authentifizierung erforderlich ist? Zum Beispiel lädt der folgende Code eine Datei von einer privaten Website herunter, auf der Benutzer sich anmelden müssen.

$source = 'https://mirror.lzex.ml/100MB.zip'
$destination = 'c:\dload\100MB.zip'
Invoke-WebRequest -Uri $source -OutFile $destination

Allerdings ist der Download aufgrund fehlender Berechtigungen fehlgeschlagen.

Downloading failed due to unauthorized access

Wenn eine Authentifizierung erforderlich ist, sollten Sie der Anfrage über den Parameter -Credential Anmeldeinformationen hinzufügen. Die erste Zeile im folgenden Code fordert Sie auf, die Anmeldeinformationen (Benutzername und Passwort) einzugeben und speichert sie in der Variablen $credential.

$credential = Get-Credential
$source = 'https://mirror.lzex.ml/100MB.zip'
$destination = 'c:\dload\100MB.zip'
Invoke-WebRequest -Uri $source -OutFile $destination -Credential $credential

Die untenstehende Demonstration zeigt, was Sie erwarten können, wenn Sie den obigen Code in PowerShell ausführen. Wie Sie sehen können, hat das Get-Credential-Cmdlet eine PowerShell-Anmeldeaufforderung angezeigt. Dieses Mal führte die Verwendung der Anmeldeinformationen mit Invoke-WebRequest zu einem erfolgreichen Download.

Downloading a file with authentication

Verwandt: Verwendung des PowerShell Get-Credential-Cmdlets und alles rund um Anmeldeinformationen

Achten Sie auf Parsing-Fehler beim Verwenden von Invoke-WebRequest

A crucial thing to remember when using Invoke-WebRequest in Windows PowerShell is that, by default, this cmdlet uses the Internet Explorer engine to parse data. The error below may happen when using Invoke-WebRequest on computers without the Internet Explorer in it.

Sie müssen Ihren Befehl erneut ausführen, aber dieses Mal den Schalter -UseBasicParsing einschließen.

Invoke-WebRequest -Uri <source> -OutFile <destination> -UseBasicParsing

In Windows PowerShell erhalten Sie möglicherweise eine Fehlermeldung: Der Antwortinhalt kann nicht analysiert werden, da der Internet Explorer-Engine nicht verfügbar ist oder die erste Konfiguration von Internet Explorer nicht abgeschlossen ist. Geben Sie den Parameter UseBasicParsing an und versuchen Sie es erneut.

Ab PowerShell Core 6.0 verwendet das Invoke-WebRequest-Cmdlet nur die Grundanalyse. Daher ist der Parameter -UseBasicParsing nicht mehr erforderlich.

Verwenden von Invoke-RestMethod

Das Invoke-RestMethod-Cmdlet dient eher dazu, eine HTTP- oder HTTPS-Anforderung an einen RESTful-Webservice zu senden. Dieses Cmdlet eignet sich besser für Anfragen, die mit REST-APIs wie der Microsoft Graph API interagieren.

Wenn es darum geht, Dateien direkt aus dem Web herunterzuladen, ist Invoke-RestMethod eine hervorragende Option. Lassen Sie sich nicht dazu verleiten, etwas anderes zu denken. Es gibt nicht viel Unterschied zwischen der Verwendung von Invoke-RestMethod und Invoke-WebRequest, wenn es um das Herunterladen von Dateien von einem direkten Weblink geht.

Herunterladen einer Datei mit Invoke-RestMethod

Verwenden Sie zum Herunterladen einer Datei mit Invoke-RestMethod die folgende Syntax. Sie werden feststellen, dass der Befehl dieselben Parameter wie Invoke-WebRequest verwendet.

Invoke-RestMethod -Uri <source> -OutFile <destination>

Im untenstehenden Beispielcode wird die Datei von der in der Variablen $source angegebenen URL heruntergeladen und dann an dem in der Variablen $destination definierten Pfad gespeichert.

$source = 'http://speedtest.tele2.net/10MB.zip'
$destination = 'c:\dload\10MB.zip'
Invoke-RestMethod -Uri $source -OutFile $destination

Wenn die Quelle eine Authentifizierung erfordert, können Sie die Anmeldeinformationen über den Parameter -Credential übergeben. Das folgende Beispiel fordert die Anmeldeinformationen an und speichert sie in der Variable $credential. Der Wert der Variable $credential wird dann an den Parameter -Credential übergeben.

Da der Dateilink eine HTTP-Quelle und nicht HTTPS ist, bedeutet dies, dass Sie eine unverschlüsselte Authentifizierung senden. In der Regel sollten Sie aus Sicherheitsgründen keine HTTP-Quellen verwenden. Wenn Sie jedoch eine HTTP-Quelle verwenden müssen, müssen Sie den Schalter -AllowUnencryptedAuthentication zu Ihrem Befehl hinzufügen.

$credential = Get-Credential
$source = 'http://speedtest.tele2.net/10MB.zip'
$destination = 'c:\dload\10MB.zip'
Invoke-RestMethod -Uri $source -OutFile $destination -Credential $credential -AllowUnencryptedAuthentication

Verwendung von Start-BitsTransfer

Start-BitsTransfer ist speziell für die Übertragung von Dateien zwischen Client- und Servercomputern entwickelt. Dieses PowerShell-Cmdlet ist abhängig vom Background Intelligent Transfer Service (BITS), der in das Windows-Betriebssystem integriert ist.

Da Start-BitsTransfer BITS zum Arbeiten benötigt, steht dieses Cmdlet nicht auf Nicht-Windows-Computern zur Verfügung. Auf der anderen Seite profitiert Start-BitsTransfer selbst von den Vorteilen von BITS. Einige dieser Vorteile sind:

  • Netzwerkbandbreiten- und Nutzungsüberwachung.
  • Behandlung von Unterbrechungen (Fortsetzung, automatische Fortsetzung, Pause usw.)
  • Herunterladen mehrerer Dateien als Hintergrundjobs.
  • Möglichkeit, Prioritäten für den Download-Job festzulegen.

Herunterladen einer Datei

Die grundlegende Methode, Start-BitsTransfer in PowerShell zum Herunterladen einer Datei zu verwenden, besteht darin, eine Quelle und ein Ziel anzugeben. Mit dem unten stehenden Skript müssen Sie nur die Werte von $source und $destination entsprechend Ihren Anforderungen ändern.

$source = 'http://speedtest.tele2.net/100MB.zip'
$destination = 'c:\dload\100MB.zip'
Start-BitsTransfer -Source $source -Destination $destination

Wie Sie aus der unten stehenden Demonstration sehen können, wird die Datei im Pfad c:\dload\100MB.zip heruntergeladen.

Downloading a file using Start-BitsTransfer

Wenn das Ziel nicht angegeben ist, lädt Start-BitsTransfer die Datei herunter und speichert sie im aktuellen Arbeitsverzeichnis. Wenn Sie beispielsweise Start-BitsTransfer von C:\dload ausführen, wird die Datei im selben Verzeichnis heruntergeladen.

Für Downloads, die eine Authentifizierung erfordern, hat Start-BitsTransfer einen -Credential-Parameter, der ein PSCredential-Objekt akzeptiert.

Mehrere Dateien herunterladen

Um das Herunterladen mehrerer Dateien zu demonstrieren, müssen Sie eine CSV-Datei mit zwei Spalten erstellen. Benennen Sie die Datei filelist.txt. Die erste Spalte sollte den Link zur Quelle enthalten, während die zweite Spalte den Ziel-Pfad enthalten muss. Der Inhalt der Datei würde wie folgt aussehen.

# source,destination
http://speedtest.tele2.net/1MB.zip,c:\dload\1MB.zip
http://speedtest.tele2.net/10MB.zip,c:\dload\10MB.zip
http://speedtest.tele2.net/100MB.zip,c:\dload\100MB.zip

Verwandt: CSV-Dateien in PowerShell mit Import-Csv verwalten

Sobald die CSV-Datei bereit ist, verwenden Sie den folgenden Befehl, um den Dateidownload zu starten. Der Befehl importiert die CSV-Datei mithilfe von Import-Csv und übergibt den Inhalt an Start-BitsTransfer.

Import-Csv .\filelist.csv | Start-BitsTransfer

Siehe das folgende Beispiel, um zu sehen, wie der obige Code funktioniert. Wie Sie sehen können, startet der Download und Sie sehen den Fortschritt des Downloads. Die PowerShell-Eingabeaufforderung ist während des Downloadprozesses nicht verfügbar.

Starting a synchronous multiple file download

Angenommen, Sie möchten den Downloadprozess als Hintergrundaufgabe starten. Fügen Sie dazu einfach den Schalter -Asynchronous am Ende des Befehls Start-BitsTransfer hinzu.

Import-Csv .\filelist.csv | Start-BitsTransfer -Asynchronous

Zunächst zeigt der Status jeder Aufgabe „Verbindung wird hergestellt“ an. Der folgende Screenshot zeigt die Job-IDs für jeden Dateidownload.

Starting file download as background jobs

Jetzt, da Sie den Downloadprozess gestartet haben, möchten Sie überprüfen, ob der Download abgeschlossen wurde. Verwenden Sie das Cmdlet Get-BitsTransfer, um den Status der Downloadaufgaben zu überprüfen. Wie Sie unten sehen können, hat sich der Status der Downloadaufgaben auf „Übertragen“ geändert.

Viewing the file download job status

Verwendung der Klassen WebClient und HttpClient (.NET Framework)

PowerShell basiert auf .NET und kann aufgrund seiner Natur die Leistungsfähigkeit von .NET selbst nutzen. In PowerShell gibt es zwei .NET-Klassen, die Sie zum Herunterladen von Dateien verwenden können: WebClient und HttpClient.

Wenn Sie mehr über diese beiden .NET-Klassen auf eine entwicklungs- und technische Weise erfahren möchten, können Sie mit Wann sollte WebClient vs. HttpClient vs. HttpWebRequest verwendet werden? beginnen. Im nächsten Abschnitt erfahren Sie, wie Sie WebClient und HttpClient in PowerShell verwenden, um Dateien aus dem Web herunterzuladen.

Herunterladen einer Datei mit Hilfe von System.Net.WebClient

Um die WebClient-Klasse zu verwenden, müssen Sie ein Objekt als System.Net.WebClient-Typ initialisieren. Im folgenden Beispiel ist das $webClient das neue System.Net.WebClient-Objekt. Mit der Methode DownloadFile() wird der Download der Datei von der Quelle gestartet.

Verwandt: Verwendung von PowerShell-Datentyp-Beschleunigern zur Beschleunigung des Codings

Bitte kopieren Sie den untenstehenden Code und führen Sie ihn in Ihrer PowerShell-Sitzung aus, um ihn zu testen. Beachten Sie, dass Sie auf dem Bildschirm keine Fortschrittsanzeige oder Ausgabe sehen, es sei denn, es liegt ein Fehler vor. Die PowerShell-Eingabeaufforderung ist jedoch gesperrt, bis der Download abgeschlossen ist.

# Definieren Sie den Quelllink und den Zielordner
$source = 'http://speedtest.tele2.net/10MB.zip'
$destination = 'c:\dload\10MB.zip'
# Erstellen Sie das neue WebClient
$webClient = [System.Net.WebClient]::new()
# Laden Sie die Datei herunter
$webClient.DownloadFile($source, $destination)

Wenn für die Quelle eine Authentifizierung erforderlich ist, um den Dateidownload zu ermöglichen, können Sie den folgenden Code verwenden. Die erste Zeile fordert die Anmeldeinformationen an und speichert sie in der Variable $credentials. Der Wert von $credential wird dann in die Anforderung für den Dateidownload einbezogen.

# Nach Benutzername und Passwort fragen
$credentials = Get-Credential
$source = 'http://speedtest.tele2.net/10MB.zip'
$destination = 'c:\dload\10MB.zip'
# Erstellen eines neuen WebClient
$webClient = [System.Net.WebClient]::new()
# Anmeldeinformation hinzufügen
$webClient.Credentials = $credentials
# Datei herunterladen
$webClient.DownloadFile($source, $destination)

Laut diesem Microsoft-Dokument: „Wir empfehlen nicht, die WebClient-Klasse für neue Entwicklungen zu verwenden. Verwenden Sie stattdessen die System.Net.Http.HttpClient-Klasse.“

Es scheint, dass die Klasse WebClient veraltet ist und dass Microsoft die neue Klasse HttpClient empfiehlt. Keine Sorge, der nächste Abschnitt behandelt die Verwendung der Klasse HttpClient in PowerShell zum Herunterladen von Dateien aus dem Web.

Datei herunterladen mit System.Net.Http.HttpClient

Wie bei der WebClient-Klasse müssen Sie zuerst den System.Net.Http.HttpClient erstellen. Mit dem folgenden Code wird die Datei von der Quelle $source nach $destination heruntergeladen. Beachten Sie die Kommentare über jeder Codezeile, um zu erfahren, was jede Zeile des Codes bewirkt.

Der folgende Code ist live und Sie können ihn testen, indem Sie ihn in Ihrer PowerShell-Sitzung ausführen.

# Setzen Sie die Quelle und das Ziel
$source = 'http://speedtest.tele2.net/10MB.zip'
$destination = 'c:\dload\10MB.zip'
 
# Erstellen Sie die HTTP-Client-Download-Anforderung
$httpClient = New-Object System.Net.Http.HttpClient
$response = $httpClient.GetAsync($source)
$response.Wait()
 
# Erstellen Sie einen Dateistream, der auf das Ausgabedateiziel zeigt
$outputFileStream = [System.IO.FileStream]::new($destination, [System.IO.FileMode]::Create, [System.IO.FileAccess]::Write)
 
# Streamen Sie den Download in den Dateistream des Ziels
$downloadTask = $response.Result.Content.CopyToAsync($outputFileStream)
$downloadTask.Wait()
 
# Schließen Sie den Dateistream
$outputFileStream.Close()

In Situationen, in denen zum Herunterladen einer Datei eine Authentifizierung erforderlich ist, müssen Sie die Anmeldeinformationen dem HttpClient-Objekt hinzufügen. Um Anmeldeinformationen zur Datei-Download-Anforderung hinzuzufügen, erstellen Sie ein neues System.Net.Http.HttpClientHandler-Objekt, um die Anmeldeinformationen zu speichern.

Sie können den folgenden Code kopieren und in PowerShell ausführen, um ihn zu testen. Oder Sie können ihn auch als PowerShell-Skript ausführen. In diesem Beispiel wird der Code als download-file.ps1 gespeichert.

# Setzen Sie die Quelle und das Ziel
$source = 'http://speedtest.tele2.net/10MB.zip'
$destination = 'c:\dload\10MB.zip'
 
# Aufforderung zur Eingabe von Anmeldeinformationen
$credentials = Get-Credential

# Erstellen Sie die HTTP-Client-Download-Anforderung mit Anmeldeinformationen
$handler = New-Object System.Net.Http.HttpClientHandler
$handler.Credentials = $credentials
$httpClient = New-Object System.Net.Http.HttpClient($handler)
$response = $httpClient.GetAsync($source)
$response.Wait()
 
# Erstellen Sie einen Dateistream, der auf das Ausgabedateiziel zeigt
$outputFileStream = [System.IO.FileStream]::new($destination, [System.IO.FileMode]::Create, [System.IO.FileAccess]::Write)
 
# Streamen Sie den Download in den Dateistream des Ziels
$downloadTask = $response.Result.Content.CopyToAsync($outputFileStream)
$downloadTask.Wait()
 
# Schließen Sie den Dateistream
$outputFileStream.Close()

Die Demo unten zeigt das Ergebnis beim Ausführen des PowerShell-Skripts zum Herunterladen der Datei.

Zu Beginn enthält das Verzeichnis nur die Skriptdatei. Es wird eine Aufforderung zur Eingabe des Benutzernamens und des Kennworts angezeigt. Anschließend wird das Skript fortgesetzt, um die Datei herunterzuladen. Nach dem Herunterladen befindet sich die neue Datei im Zielverzeichnis.

Downloading a file using the .NET HttpClient class

Schlussfolgerung

Windows PowerShell und PowerShell Core verfügen über integrierte Fähigkeiten zum Herunterladen von Dateien und fungieren als Alternative zu PowerShell wget! Egal, ob es sich um passwortgeschützte Quellen, einzelne oder mehrere Dateien handelt – eine PowerShell-Methode steht Ihnen zur Verfügung.

Die in diesem Artikel behandelten Methoden zum Herunterladen von Dateien funktionieren sowohl in Windows PowerShell als auch in PowerShell Core. Dies bedeutet, dass diese Methoden sowohl für Windows- als auch für Nicht-Windows-Systeme gelten, mit Ausnahme von Start-BitsTransfer.

Und da PowerShell mehr als eine Eingabeaufforderung ist, können Sie das Gelernte in Skripte umsetzen. Für Sie bedeutet das eine Möglichkeit zur Automatisierung. Kein Kopieren von URLs, Klicken von Links und manuelles Warten mehr auf Downloads.

Source:
https://adamtheautomator.com/powershell-download-file/