Efficiënt files downloaden in batch

Inleiding

Waar nodig gebruik ik ook PowerShell code. Zo had ik laatst de opdracht om een hoop bestanden te downloaden van internet, en te categoriseren in folders op de harde schijf. Aangezien het over grote bestanden gaat en ik niet weet met welke frequentie de bestanden bijgewerkt worden, is het efficiënter om te kijken of de bewuste file wel veranderd is tegenover de versie die reeds op de harde schijf staat. Zo kom je tot een nuttig script dat je periodiek (1 keer per dag bijvoorbeeld) geautomatiseerd kan uitvoeren. Dit neemt een hoop manuele checks weg. Door de efficiëntie vermijden we nutteloze downloads van bestanden die toch niet veranderd zijn.

Mijn test om te bepalen of een bestand veranderd werd, is het vergelijken van de bestandsgroottes op de remote locatie en op de harde schijf. Je kan hier extra checks of meer omstandige checks gebruiken indien gewenst.

PowerShell code
$ErrorActionPreference = 'SilentlyContinue' $Base_URL = "https://www.wimgielis.com/xlwdfiles/" $Download_Folder = "D:\test\" $array_Files = @( "excel_kruiswoordraadsel_NL.xlsm", "excel_kruiswoordraadsel_NL.xlsm", "excel_kruiswoordraadsel_NL.xlsm", "excel_kruiswoordraadsel_NL.xlsm") $array_Folders = @( "Folder 1", "Folder 2", "Folder 3", "Folder 4") $MailTo = "YOUR_OFFICE_365_ACCOUNT" $MailFrom = "YOUR_OFFICE_365_ACCOUNT" $Subject = "Downloads: changed file" $Server = "smtp.office365.com" $Port = "587" $Pwd = "YOUR_OFFICE_365_PASSWORD" $SmtpClient = New-Object Net.Mail.SmtpClient($Server, $Port) $SmtpClient.EnableSSL = $true $SmtpClient.Credentials = New-Object System.Net.NetworkCredential($MailFrom, $Pwd); $wc = New-Object System.Net.WebClient $i = 0 foreach ($f in $array_Files) { $rf = $Base_URL+$f $hfld = $Download_Folder+$array_Folders[$i] # md -Force $hfld If( !(test-path $hfld)) { New-Item -ItemType Directory -Force -Path $hfld > $null } $hf = $hfld+"\"+$f $rse = 0; if (Test-Path $hf) { $rse = (Get-Item $hf).length } $rs = (Invoke-WebRequest $rf -Method Head).Headers.'Content-Length' if ($rs -ne $rse) { $wc.DownloadFile($rf, $hf) $SmtpClient.Send($MailFrom, $MailTo, $Subject, $hf) } $i++ }

Om dan zelf te weten dat er een nieuw(e versie van een) bestand is, verstuur ik ook automatisch een email in voorkomend geval. Anders niet. Het is 1 email per bestand en dit gaat via de Office 365 account.

Voor zij die geïnteresseerd zijn in de PowerShell code, probeer het gerust een keer uit met een eigen website en bestanden en mappen. Vul de juiste parameters en instellingen in en kijk of het werkt ! Bijvoorbeeld, als de bestanden die je download eigenlijk zipbestanden zijn, dan kan je het script aanvullen met een automatische unzip-functionalitiet. Om dat te doen kan je het Expand-Archive commando gebruiken. zippen is de omgekeerde beweging en kan je doen met Compress-Archive.




Homepage

Rubriek onderdelen

Over Wim

Wim Gielis is Business Intelligence consultant en Excel expert

Andere links