Zippen via het Windows Explorer context menu

VBScript code

We wensen 7-zip aan te spreken om een bestand (het aangeklikte bestand) om te zetten in een zipbestand. M.a.w. onze VBScript code heeft deze zaken nodig voor wat betreft het zippen:

  • welk bestand wensen we te zippen?
  • in welke map bevindt dit bestand zich? (het gezipte bestand vervangt het origineel in dezelfde map)
  • wat is de bestandsnaam? (de extensie zip zal in de plaats komen van de oorspronkelijke extensie)
  • waar werd 7-zip geïnstalleerd op de harde schijf?
Verderop in de code zal je dit kunnen terugvinden.

VBScript code kan gebruikt worden om de registerwijzigingen te doen, zodat dit niet manueel hoeft te gebeuren. Ik heb mij gebaseerd op code van Bill James. Deze code kopieer je en zet je in een .txt bestand dat je vervolgens van extensie verandert in .vbs. Je hebt dan een VBScript code bestand. De code laat toe om:

  • bij een dubbelklik op het .vbs bestand het menu-item toe te voegen, aldus de registerwijzigingen te doen
  • bij een volgende dubbelklik op hetzelfde .vbs bestand het menu-item weer te verwijderen, alweer zijn er geen manuele registerwijzigingen nodig
  • het pad en bestandsnaam van het .vbs bestand wordt bijgehouden in het register. Zo weet het menu-item "zip and delete" welke VBScript code uitgevoerd dient te worden.

Het zou mij te ver leiden om de hele VBS code te bespreken (overigens zeer leerrijk). Laat ik het coderen van de registeraanpassingen overslaan, en enkel focussen op het hart van de code: een bestand zippen en vervolgens verwijderen van de harde schijf.

Sub ZipAndDelete
' Wim Gielis ' http://www.wimgielis.com
''''' ' Zip en verwijder een bestand in VBScript code ' 13/10/12 '''''
'main code: zip and delete s7zLocation = "C:\Program Files\7-Zip\" sArchiveName = fso.GetParentFolderName(Args(0)) & "\" & fso.GetBaseName(Args(0)) & ".zip" sFile = Args(0) If lcase(fso.GetExtensionName(sFile)) <> "zip" Then If fso.FileExists(sArchiveName) Then fso.DeleteFile sArchiveName, True End If ws.Run """" & s7zLocation & "7z"" a -tzip -y " & chr(34) & sArchiveName & chr(34) & " " & chr(34) & sFile & chr(34), 0, True If lcase(fso.GetExtensionName(sFile)) <> "zip" Then fso.DeleteFile sFile, True
End Sub

Hierboven gaan we:

  1. de locatie bijhouden waar 7-zip geïnstalleerd is (variabele s7zLocation)
  2. het pad en de naam van het zipbestand opstellen (variabele sArchiveName)
  3. uitlezen welk bestand gekozen werd voor het zippen (Args(0) is dit, in de variabele sFile)
  4. Dan gaan we het gezipte bestand, mocht het reeds bestaan, preventief verwijderen (commando DeleteFile)
  5. Daarna zippen we het gekozen bestand (commando ws.Run om 7-zip aan te spreken met parameters)
  6. Tot slot verwijderen we het originele niet-gezipte bestand (commando DeleteFile)

Resultaat

Het resultaat van onze VBScript uitstap is voor de eerder geziene Access database dit:

Wil jij dit ook? Download dan zeker het tekstbestandje met code aan het begin van het artikel op blad 1. Zet de code in een .txt bestand dat je vervolgens van naam verandert in .vbs. En dan kan het experimenteren en leren beginnen ! Je bent ook vrij om in plaats van het zippen en verwijderen andere nuttige operaties te coderen in de VBScript code.

Over Wim

Wim Gielis is Business Intelligence consultant en Excel expert

Andere links