In diesem Hinweis zeige ich, wie man eine Datei von der URL mit dem Befehl Invoke-WebRequest in PowerShell herunterlädt, wie man die langsame Downloadgeschwindigkeit behebt und wie HTTP-Header übergeben werden (z. B. API-Schlüssel) Es gibt zwei Möglichkeiten, Dateien von PowerShell herunterzuladen und an einem Ordnerspeicherort zu speichern. Bei der ersten Methode wechseln Sie zu dem Ordner, in dem Sie mit dem Befehl cd speichern möchten. Ich denke, Sie problem hier ist, dass die Website ändert die URL, die Out-Datei dieser URL ist eigentlich html. Wenn Sie über einen Webserver verfügen, auf dem das Durchsuchen von Verzeichnissen zulässig ist, könnten Sie vermutlich invoke-webrequest/invoke-restmethod für diesen Ordner verwenden, in dem verfügbare Dateien auflisten. Dann können Sie die Ausgabe analysieren und nach dem Herunterladen bestimmter Dateien (oder aller Dateien) fragen. Aber ich sehe keinen geradlinigen Weg. Der nächste einfache Fall ist, wo Sie eine Datei aus dem Web oder von einem FTP-Server herunterladen müssen. In PowerShell 2 mussten Sie dazu das New-Object Cmdlet verwenden: Windows PowerShell kann zum Herunterladen von Dateien über HTTP- und HTTPS-Protokolle verwendet werden. Sie können den URI in einer Textdatei speichern und dann in Ihrem Skript mit Get-Content lesen. PowerShell überprüft nicht, ob der von Ihnen angegebene Dateiname bereits verwendet wird.

Wenn Sie bereits eine Datei mit dem Namen image.jpg in einem Ordner haben, stellen Sie sicher, dass Sie keine andere Datei mit demselben Namen herunterladen und speichern. Wenn Sie in einer hybriden IT-Umgebung arbeiten, müssen Sie in Ihren PowerShell-Skripts häufig Dateien aus oder in die Cloud herunterladen oder hochladen. Wenn Sie nur Windows-Server verwenden, die über das SMB-Protokoll (Server Message Block) kommunizieren, können Sie einfach das Cmdlet Copy-Item verwenden, um die Datei aus einer Netzwerkfreigabe zu kopieren: PowerShell korrigiert Dateierweiterungen nicht. Wenn Sie PowerShell verwenden, um eine JPG-Datei herunterzuladen und sie anzuweisen, sie als PNG zu speichern, wenn Sie den Speicherort erhalten, wird PowerShell Sie nicht korrigieren. Dies führt dazu, dass Sie die Datei nicht öffnen können, da die Erweiterung falsch ist. Sie müssen die Dateierweiterung beheben, bevor Sie die Datei öffnen können. Wenn Sie die Datei in der Pipeline haben und lokal speichern möchten, müssen Sie den Parameter -PassThru verwenden: Beachten Sie, dass diese Methode nur funktioniert, wenn der Webserver die Authentifizierung verwaltet. Heutzutage verwenden die meisten Websites die Funktionen eines Content Management Systems (CMS), um Benutzer zu authentifizieren.

In der Regel müssen Sie dann ein HTML-Formular ausfüllen. Ich werde in einem meiner nächsten Beiträge erklären, wie Sie dies mit Invoke-WebRequest tun können. Wenn Sie z. B. PowerShell öffnen, wird der aktuelle Benutzerordner geöffnet. Sie können den Befehl cd verwenden, um z. B. in den Ordner Downloads zu wechseln. Ab PowerShell 3 haben wir das Invoke-WebRequest Cmdlet, das bequemer zu bearbeiten ist. Es ist PowerShells Gegenstück zu GNU wget, einem beliebten Tool in der Linux-Welt, was wahrscheinlich der Grund ist, warum Microsoft sich entschieden hat, seinen Namen als Alias für Invoke-WebRequest zu verwenden.

Das ist vielleicht eine Untertreibung; Invoke-WebRequest ist leistungsfähiger als wget, da Sie dateien nicht nur herunterladen, sondern auch analysieren können. Aber dies ist ein Thema für einen anderen Beitrag. Ich führe ein Skript auf einer geplanten Basis (täglich) aus, um eine CSV-Datei herunterzuladen. Allerdings ändert sich die uri jeden Monat, so dass ich mich fragte, ob der uri Zielwert basierend auf einem Wert in einer Referenzdatei im Gegensatz zu harter Codierung festgelegt werden kann, wenn ja wie? Wenn Sie die Outfile in .html ausgeben, sehen Sie, wenn Sie die Datei öffnen, html-Header enthält, wenn Sie die Datei im Notizblock usw. öffnen.