Heb je bestanden die je van het web moet downloaden, maar heb je een hekel aan het herhaaldelijk klikken op links? Als je regelmatig bestanden van het web moet downloaden voor je werk, wil je waarschijnlijk de taak automatiseren. Waarom gebruik je PowerShell niet om bestanden te downloaden, vergelijkbaar met een alternatieve PowerShell wget?
Windows PowerShell en PowerShell hebben mogelijkheden voor het downloaden van bestanden. Bestanden downloaden met PowerShell is een kwestie van weten welke cmdlets en .NET-klassen je moet gebruiken en hoe je ze moet gebruiken.
In dit artikel leer je de verschillende manieren om PowerShell te gebruiken voor het downloaden van bestanden van het web.
Vereisten
Aangezien dit een learning-by-doing artikel is, zijn er enkele vereisten om ervoor te zorgen dat je de voorbeelden kunt volgen. Hieronder staan de basisvereisten.
- 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 of PowerShell 7.1 (aanbevolen).
- Windows 10 bevat al Windows PowerShell 5.1.
- A web site that hosts the files to download.
- Voor niet-geauthenticeerde bestandsdownloads overweeg het gebruik van de Tele2 Speedtest site, die gratis is.
- Als je bestandsdownloads met autorisatie wilt testen, moet je mogelijk je eigen HTTP-bestandsserver bouwen. Een voorbeeld van een gratis HTTP-bestandsserver is HFS door Rejetto.
Gebruik van PowerShell om bestanden van URLs te downloaden: Vier manieren
Er zijn vier methoden om PowerShell te gebruiken voor het downloaden van bestanden die niet afhankelijk zijn van externe tools. Dit zijn:
Invoke-WebRequest
Invoke-RestMethod
Start-BitsTransfer
- .NET WebClient-klasse.
Welke van deze vier methoden u ook gebruikt, de logica en onderdelen om ze te laten werken zijn hetzelfde. Er moet een bron-URL zijn die naar de locatie van het bestand wijst en het bestemmingspad om de gedownloade bestanden op te slaan. Indien vereist door de webserver, moet u ook de referenties invoeren.
De volgende secties tonen elk van deze vier methoden. Uiteindelijk is het aan u om te beslissen welke manier u zou aanpassen bij het gebruik van PowerShell om bestanden te downloaden.
Het gebruik van Invoke-WebRequest als een alternatief voor PowerShell wget
De eerste methode in PowerShell om bestanden te downloaden is door gebruik te maken van de Invoke-WebRequest
cmdlet. Misschien wel de meest gebruikte cmdlet in dit artikel, Invoke-WebRequest
, kan HTTP-, HTTPS- en FTP-links downloaden.
Of de bronlocatie gebruikers vereist om in te loggen, de Invoke-WebRequest
cmdlet kan verzoeken met referenties ook afhandelen.
Om een bestand te downloaden, toont de onderstaande syntaxis de minimale parameters die nodig zijn om het gewenste resultaat te bereiken.
Bijvoorbeeld, de code hieronder downloadt een bestand met de naam 10MB.zip van een website. Vervolgens slaat het het gedownloade bestand op in C:\dload\10MB.zip. U kunt de onderstaande code kopiëren en plakken in uw PowerShell-sessie om te testen.
De demonstratie hieronder toont het verwachte resultaat na het uitvoeren van de bovenstaande code in PowerShell. Zoals je kunt zien, was de bestandsdownload succesvol.

Wat als de bron authenticatie vereist voordat toegang wordt verleend? Bijvoorbeeld, de onderstaande code downloadt een bestand van een privéwebsite waar gebruikers moeten inloggen.
De download is echter mislukt vanwege ongeautoriseerde toegang.

Als authenticatie vereist is, moet je een referentie toevoegen aan het verzoek met behulp van de -Credential
-parameter. De eerste regel in de onderstaande code vraagt je om de referentie (gebruikersnaam en wachtwoord) in te voeren en slaat deze op in de variabele $credential
.
De demonstratie hieronder laat zien wat je kunt verwachten wanneer je de bovenstaande code uitvoert in PowerShell. Zoals je kunt zien, heeft het Get-Credential
-cmdlet een PowerShell-referentieverzoek veroorzaakt. Deze keer resulteerde het gebruik van de referentie met Invoke-WebRequest
in een succesvolle download.

Gerelateerd: Het gebruik van het PowerShell Get-Credential-cmdlet en alles met betrekking tot referenties
Let op bij het optreden van parseringsfouten bij het gebruik van 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.
Je zult je commando opnieuw moeten uitvoeren, maar dit keer met de -UseBasicParsing
-schakelaar.
In Windows PowerShell kun je mogelijk een foutmelding ontvangen: De inhoud van de respons kan niet worden geanalyseerd omdat de Internet Explorer-engine niet beschikbaar is, of de eerste configuratie van Internet Explorer is niet voltooid. Specificeer de parameter UseBasicParsing en probeer het opnieuw.
Vanaf PowerShell Core 6.0 gebruikt de cmdlet Invoke-WebRequest
alleen basisanalyse. Als zodanig is de parameter -UseBasicParsing
niet langer nodig.
Gebruik van Invoke-RestMethod
De cmdlet Invoke-RestMethod
is meer gericht op het verzenden van een HTTP- of HTTPS-verzoek naar een RESTful webservice. Deze cmdlet is meer geschikt voor verzoeken die interageren met REST-API’s zoals de Microsoft Graph API.
Als het gaat om het rechtstreeks downloaden van bestanden van internet, is Invoke-RestMethod
een uitstekende keuze. Laat je niet misleiden door iets anders te denken. Er is niet veel verschil tussen het gebruik van Invoke-RestMethod
en Invoke-WebRequest
bij het downloaden van bestanden vanaf een directe weblink.
Downloaden van een bestand met Invoke-RestMethod
Om een bestand te downloaden met Invoke-RestMethod
, gebruik de onderstaande syntaxis. Je zult merken dat de opdracht dezelfde parameters gebruikt als Invoke-WebRequest
.
In de onderstaande voorbeeldcode wordt het bestand gedownload vanaf de URL-waarde in de variabele $source
. Vervolgens wordt het opgeslagen op het pad dat is gedefinieerd in de variabele $destination
.
Als de bron authenticatie vereist, kunt u de referenties doorgeven met behulp van de -Credential
-parameter. Het onderstaande voorbeeld vraagt om de referenties en slaat deze op in de variabele $credential
. De waarde van de variabele $credential
wordt vervolgens doorgegeven aan de -Credential
-parameter.
Ook, aangezien de bestandskoppeling een HTTP-bron is en geen HTTPS, betekent dit dat u ongecodeerde authenticatie verzendt. U moet doorgaans vermijden HTTP-bronnen te gebruiken voor veiligheid. Maar als u toch een HTTP-bron moet gebruiken, moet u de -AllowUnencryptedAuthentication
-schakelaar toevoegen aan uw opdracht.
Het gebruik van Start-BitsTransfer
Start-BitsTransfer
is specifiek ontworpen voor het overbrengen van bestanden tussen client- en servercomputers. Deze PowerShell-cmdlet is afhankelijk van de Background Intelligent Transfer Service (BITS) die native is voor het Windows-besturingssysteem.
Omdat Start-BitsTransfer
BITS nodig heeft om te functioneren, betekent dit dat deze cmdlet niet beschikbaar is op niet-Windows-computers. Aan de andere kant profiteert Start-BitsTransfer
van de voordelen van BITS zelf. Enkele van deze voordelen zijn:
- Bewustzijn van netwerkbandbreedte en -gebruik.
- Omgaan met onderbrekingen (hervatten, automatisch hervatten, pauzeren, enz.)
- Het downloaden van meerdere bestanden als achtergrondtaken.
- Mogelijkheid om downloadtaakprioriteiten in te stellen.
Het downloaden van een bestand
Het fundamentele gebruik van Start-BitsTransfer
in PowerShell om een bestand te downloaden, is door een bron en bestemming op te geven. Met het onderstaande script hoef je alleen de waarden van $source
en $destination
aan te passen aan je eisen.
Zoals je kunt zien in de onderstaande demo, wordt het bestand gedownload naar het pad c:\dload\100MB.zip.

Stel dat de bestemming niet is gespecificeerd, dan downloadt
Start-BitsTransfer
het bestand en slaat het op in de huidige werkmap. Als je bijvoorbeeldStart-BitsTransfer
uitvoert vanuit C:\dload, wordt het bestand gedownload naar dezelfde map.
Voor downloads die authenticatie vereisen, heeft Start-BitsTransfer
een -Credential
-parameter die een PSCredential-object accepteert.
Meerdere bestanden downloaden
Om het downloaden van meerdere bestanden te demonstreren, moet je een CSV-bestand maken met twee kolommen. Noem het bestand filelist.txt. De eerste kolom moet de link naar de bron bevatten, terwijl de tweede kolom het bestemmingspad moet bevatten. De inhoud van het bestand ziet er als volgt uit.
Gerelateerd: CSV-bestanden beheren in PowerShell met Import-Csv
Zodra het CSV-bestand gereed is, gebruik dan onderstaand commando om het downloaden van het bestand te starten. Het commando importeert het CSV-bestand met behulp van Import-Csv
en geeft de inhoud door aan Start-BitsTransfer
.
Bekijk de demo hieronder om te zien hoe het bovenstaande codeblok werkt. Zoals je kunt zien, begint de download en zie je de voortgang van de download. De PowerShell-prompt is niet beschikbaar tijdens het downloadproces.

Stel dat je het downloadproces als achtergrondtaak wilt starten. Voeg hiervoor simpelweg de -Asynchronous
-schakelaar toe aan het einde van het Start-BitsTransfer
-commando.
In eerste instantie toont de status van elke taak ‘Verbinding maken’. Op de onderstaande schermafbeelding zie je de id van elke gedownloade taak.

Nu je het downloadproces hebt gestart, wil je controleren of het downloaden is voltooid. Gebruik de Get-BitsTransfer
-cmdlet om de status van de downloadtaak te controleren. Zoals je hieronder kunt zien, is de status van de downloadtaken gewijzigd in Overgebracht.

Gebruik van WebClient Class en HttpClient Class (.NET Framework)
PowerShell is gebaseerd op .NET, en de aard ervan maakt het mogelijk om de kracht van .NET zelf te benutten. Er zijn twee .NET-klassen die je kunt gebruiken in PowerShell om bestanden te downloaden; WebClient en HttpClient.
Als je meer wilt weten over deze twee .NET-klassen op een meer ontwikkelings- en technische manier, kun je beginnen met → Wanneer WebClient te gebruiken versus HttpClient versus HttpWebRequest. In de volgende sectie leer je hoe je WebClient en HttpClient in PowerShell kunt gebruiken om bestanden van het web te downloaden.
Bestand downloaden met behulp van System.Net.WebClient
Om de WebClient-klasse te gebruiken, moet je een object initiëren als een System.Net.WebClient
**type. In het onderstaande voorbeeld is de $webClient
het nieuwe object van het type System.Net.WebClient
. Vervolgens start je met de DownloadFile()
-methode het downloaden van het bestand van de bron.
Gerelateerd: PowerShell-datatypesnelkoppelingen gebruiken om codering te versnellen
Kopieer onderstaande code en voer deze uit in je PowerShell-sessie om te testen. Merk op dat je geen voortgang of uitvoer op het scherm zult zien, tenzij er een fout is. De PowerShell-prompt wordt echter vergrendeld totdat de download is voltooid.
Als de bron verificatie vereist om het bestand te downloaden, kunt u de onderstaande code gebruiken. De eerste regel vraagt om de inloggegevens en slaat deze op in de variabele $credentials
. De waarde van $credential
wordt vervolgens opgenomen in het verzoek om het bestand te downloaden.
Volgens dit Microsoft-document: “We raden af om de WebClient-klasse te gebruiken voor nieuwe ontwikkelingen. Gebruik in plaats daarvan de System.Net.Http.HttpClient-klasse.”
Het lijkt erop dat de WebClient-klasse verouderd is, en de nieuwe klasse die Microsoft aanbeveelt, is de HttpClient-klasse. Maak je echter geen zorgen. Het volgende gedeelte gaat over het gebruik van de HttpClient-klasse in PowerShell om bestanden van het web te downloaden.
Een bestand downloaden met behulp van System.Net.Http.HttpClient
Net als bij de WebClient-klasse moet je eerst de System.Net.Http.HttpClient
maken. Met de onderstaande code wordt het bestand van de $source
naar de $destination
gedownload. Raadpleeg de opmerkingen boven elke regel om te weten wat elke regel code doet.
De onderstaande code is actief en je kunt deze testen door hem uit te voeren in je PowerShell-sessie.
In situaties waarbij het downloaden van een bestand verificatie vereist, moet je de referenties toevoegen aan het HttpClient-object. Om een referentie op te nemen bij het downloaden van het bestand, maak je een nieuw System.Net.Http.HttpClientHandler
-object aan om de referenties op te slaan.
Je kunt de onderstaande code kopiëren en uitvoeren in PowerShell om te testen. Of je kunt het ook uitvoeren als een PowerShell-script. In dit voorbeeld is de code opgeslagen als download-file.ps1.
De demo hieronder toont het resultaat bij het uitvoeren van het PowerShell-script om het bestand te downloaden.
Aan het begin bevat de map alleen het scriptbestand. Er verschijnt een prompt om de gebruikersnaam en het wachtwoord in te voeren. Vervolgens gaat het script verder met het downloaden van het bestand. Na het downloaden van het bestand zie je dat het nieuwe bestand zich nu in de doelmap bevindt.

Conclusie
Windows PowerShell en PowerShell Core worden geleverd met ingebouwde mogelijkheden om bestanden te downloaden, als alternatief voor PowerShell wget! Of je nu beveiligde bronnen, enkele of meerdere bestanden downloadt – er is een PowerShell-methode beschikbaar voor jou.
De bestandsdownloadmethoden die in dit artikel worden behandeld, werken zowel in Windows PowerShell als in PowerShell Core. Dit betekent dat deze methoden van toepassing zijn op zowel Windows- als niet-Windows-systemen, met uitzondering van Start-BitsTransfer
.
En aangezien PowerShell meer is dan een opdrachtprompt, kun je wat je hebt geleerd omzetten in scripts. Voor jou betekent dit een kans voor automatisering. Geen URL’s meer kopiëren, links klikken en handmatig wachten op downloads.
Source:
https://adamtheautomator.com/powershell-download-file/