AutoHotKey: OneDrive miserie opkuisen
- 28/11/2021
Inleiding
Op de computer gebruik ik al een tijdje OneDrive. Dat ging altijd redelijk goed, ook al zijn er bepaalde kleinere ergernissen, maar afgelopen week ging het mis. Ik had een tijdje terug de automatische update functie uitgeschakeld omwille van andere redenen. Ik had er toen ook niet bij stil gestaan dat dat gevolgen zou kunnen hebben. Enkele dagen terug schakelde ik de automatische update functie weer in. Opeens begon ik "dubbele bestanden" op te merken:
Wat er gebeurd was, was het volgende: OneDrive heeft een eerdere versie van het bestand teruggeplaatst in de map. De meest recente versie, wat eigenlijk de versie is die ik wil behouden, werd hernoemd met een suffix. Dat suffix is een liggend streepje gevolgd door AEX199, dat is de naam van de computer. Ik wil met andere woorden 4 acties doen:
- zoeken naar alle bestanden met suffix -AEX199
- testen of in dezelfde map ook het bestand bestaat met dezelfde naam, uitgezonderd -AEX199
- het oudere bestand met de kortere naam fysiek verwijderen
- het nieuwere bestand met de langere naam niet verwijderen maar hernoemen zonder de suffix -AEX199
Ik dacht direct aan de automatiseringstaal AutoHotKey. Met wat regels code zou ik de files wel kunnen opkuisen met een minimum aan moeite. PowerQuery had ook gekund om de files binnen te halen in een Excel bestand, maar dan was er toch nog VBA code nodig. Dus die oplossing is omslachtiger. Ook het nieuwere Power Automate Desktop had wellicht een optie geweest: lees hier meer.
Hieronder volgt de code om de bestanden op te kuisen:
x := 0 folder := "D:\OneDrive" Loop, files, %folder%\*-AEX199.*, R { subfolder := A_LoopFileDir StringReplace, vPreviousFile, A_LoopFileName, -AEX199 IfExist, %subfolder%\%vPreviousFile% { x++ FileDelete, %subfolder%\%vPreviousFile% FileMove %A_LoopFileFullPath%, %subfolder%\%vPreviousFile% } } msgbox %x%
Dat is uiteindelijk niet heel veel code gebleken. De code kuiste een kleine 1000 bestanden op in enkele seconden tijd.
Bespreking van de code
De code is vrij rechttoe rechtaan denk ik. We maken een lus doorheen de mappen binnen een eigen welgekozen map. Ook de submappen binnen die mappen worden doorlopen aan de hand van de R in het Loop statement (R = Recursief). Het patroon van de bestandsnaam bevat inderdaad die -AEX199 en voor de rest wildcard karakters. Vervolgens haal ik de map op en haal ik -AEX199 weg (juister, ik vervang het door niets). Als dan het resulterende bestand bestaat, dan weet ik dat ik een bestand moet verwijderen en een ander bestand hernoemen (in de juiste volgorde gegeven de naamconflicten). Dat kan je doen met FileDelete en FileMove, respectievelijk. De variabele x, tot slot, houdt bij over hoeveel gevallen het gaat, en wordt aan mij getoond in een message box op het einde. Altijd handige informatie.
Zo, dat is weer netjes ! Wie weet kan jij deze code ook nog eens inzetten of heb je andere nuttige toepassingen in gedachten.