AutoIt: Tekst zoeken en vervangen met StringReplace functie in een string

Wil je vanuit je AutoIt-script een bestand downloaden en zeker weten dat het goed gaat? Dan is deze blogpost iets voor jou. We bekijken hoe je met de functie InetGet een bestand downloadt, controleert of het gelukt is en netjes afsluit. Simpel, duidelijk en praktisch.

Wat is het probleem?

Je wilt vanuit een AutoIt-script een bestand downloaden van internet. Bijvoorbeeld een update, een configuratiebestand of een afbeelding. Je start een download met InetGet,maar soms werkt het niet zoals verwacht. Het bestand komt niet aan, de download stopt halverwege of het script blijft hangen. Hoe zorg je ervoor dat het script betrouwbaar een bestand haalt en je weet of het gelukt is?

Waarom loopt dit vaak mis?

Een download via AutoIt kan om verschillende redenen misgaan:

  • Geen internetverbinding: Dan kan het script natuurlijk niets ophalen.
  • Verkeerde URL: De link klopt niet of het bestand bestaat niet.
  • Bestand niet compleet: De download wordt afgebroken.
  • Geen controle achteraf: Je checkt niet of het bestand er echt is, dus het script gaat verder met een leeg of onvolledig bestand.
  • Vergeten verbinding sluiten: De handle van de download blijft open, wat problemen kan geven bij hernieuwde downloads.

Daarom is het belangrijk om een eenvoudige, maar duidelijke downloadflow te maken. Met foutcontrole en afsluiting.

Hoe werkt het?

InetGet is de AutoIt-functie die een bestand downloadt van een URL naar een lokale map. Deze functie geeft een handle terug als de download gestart is, of 0 bij een fout. met die handle kun je later de download in de gaten houden of stoppen.

Na het starten van de download is het slim om te wachten tot het bestand volledig binnen is. Daarna check je met FileExists of het bestand echt op de schijf staat. Als laatste sluit je de verbinding met InetClose om resources vrij te maken.

Stap voor stap

  1. Start de download met InetGet Je geeft de URL en het pad waar het bestand moet komen.
  2. Controleer of de download gestart is Als InetGet 0 teruggeeft,is er iets mis.
  3. Wacht tot het bestand bestaat Gebruik een simpele lus om te wachten, bijvoorbeeld max 30 seconden.
  4. Controleer of het bestand echt is gedownload Met FileExists kijk je of het bestand er is.
  5. Sluit de download-verbinding Gebruik InetClose met de handle van InetGet.
  6. Geef feedback Meld aan de gebruiker of het gelukt is, of niet.

Voorbeeldcode

#include <inet.au3>

Local $sURL = "https://www.autoitscript.com/autoit3/files/example.txt"
local $sSavePath = @ScriptDir & "example.txt"

; Start de download
Local $hDownload = InetGet($sURL, $sSavePath, 1, 1)

; Controleer of download gestart is
if $hDownload = 0 Then
    MsgBox(16, "Fout", "Download kon niet gestart worden.")
    Exit
EndIf

; Wacht tot bestand beschikbaar is (max 30 seconden)
Local $iWaitTime = 0
While Not FileExists($sSavePath) And $iWaitTime < 30
    Sleep(1000)
    $iWaitTime += 1
WEnd

; Controleer of bestand bestaat
If Not FileExists($sSavePath) Then
    inetclose($hDownload)
    MsgBox(16, "Fout", "download niet gelukt binnen tijdslimiet.")
    Exit
endif

; Sluit de download verbinding
InetClose($hDownload)

MsgBox(64, "Succes", "Bestand succesvol gedownload naar: " & $sSavePath)

Handige uitbreiding

Wil je weten of de download echt compleet is? Je kunt de grootte van het gedownloade bestand vergelijken met wat je verwacht. Bijvoorbeeld door de grootte van het originele bestand op te vragen (indien beschikbaar) of door een checksum te controleren.

Een simpele uitbreiding is om de bestandsgrootte na het downloaden uit te lezen:

Local $iSize = FileGetSize($sSavePath)
If $iSize < 100 Then
    MsgBox(48, "Waarschuwing", "Bestand lijkt erg klein, controleer de inhoud.")
EndIf

Ook kun je de download flow in een functie stoppen zodat je het makkelijk hergebruikt:

Func DownloadBestand($sURL, $sTarget)
    Local $h = InetGet($sURL, $sTarget, 1, 1)
    If $h = 0 Then Return SetError(1,0,false)
    Local $i = 0
    While Not FileExists($sTarget) And $i < 30
        Sleep(1000)
        $i += 1
    WEnd
    InetClose($h)
    If FileExists($sTarget) Then Return True
    Return SetError(2,0,False)
EndFunc

veelgemaakte fout

Een veelvoorkomende fout is vergeten InetClose aan te roepen. Als je dat niet doet, blijft de download-handle open. dit kan leiden tot geheugenlekken of dat het bestand niet goed opgeslagen wordt.

Ook zien we vaak dat men niet wacht tot het bestand klaar is. InetGet start alleen de download, maar is niet blokkerend. Je moet dus zelf controleren of het bestand er is voordat je verder gaat.

Tot slot: gebruik altijd volledige paden en controleer URL’s op juistheid. Downloaden werkt alleen als de URL beschikbaar is en je schrijfrechten hebt op de doellocatie.

Bevers gedachte

Met InetGet en een paar simpele checks heb je een betrouwbare download-flow in je autoit-scripts. Start de download, wacht rustig af, controleer en sluit netjes af. Zo voorkom je onverwachte fouten en zorg je dat je script altijd weet of het bestand er is. Dit maakt je scripts robuuster en makkelijker te onderhouden. Probeer het zelf en bouw het in je projecten in!

Functie Parameter Omschrijving
InetGet URL, lokaal pad, optie, flag Start een download en geeft een handle terug
FileExists Pad naar bestand Controleert of een bestand bestaat
InetClose Handle van download Sluit de download verbinding en maakt resources vrij