En kollega behövde ett script för att stänga alla öppnade PST-filer i Outlook. Google gav följande träff:
Men scriptet på sidan ovan innehåller ett fel: Vissa PST-filer hoppas över.
Detta beror på att scriptet använder For Each för att gå igenom alla Stores-objekt i den aktuella Outlook-sessionen, men inuti loopen raderar man element i samma lista. Elementet efter det raderade kommer aldrig att kontrolleras.
Min lösning ser i stället ut så här (i vbscript):
Option Explicit On Error Resume Next Dim o 'As Outlook.Application Dim s 'As Outlook.Stores Dim f 'As Outlook.Folder Dim i 'As Integer Set o = CreateObject("Outlook.Application") Set s = o.Session.Stores i=1 ' The store array begins at 1 Do Until i > s.Count ' If there are stores left to check If s(i).ExchangeStoreType = 3 Then ' If this is a PST store, Set f = s(i).GetRootFolder ' find the root folder. o.Session.RemoveStore f ' Try to remove the store. If Err<>0 Then ' If an error occured, i=i+1 ' continue to next store Err.Clear ' and clear the error. End If Else ' If this is NOT a PST store, i=i+1 ' continue to next store. End If Loop ' Repeat all over again.
Här är ett annat exempel där man i stället loopar igenom alla mappar två gånger. Lite mindre effektivt men lite enklare att förstå. Och vad är väl en bortslösad millisekund med dagens datorer?
Option Explicit Dim o, s, i, f() Set o = CreateObject("Outlook.Application") Set s = o.Session.Stores Redim f(s.Count) ' Create an array For i=1 to Ubound(f) If s(i).ExchangeStoreType = 3 Then ' If this is a PST store, Set f(i) = s(i).GetRootFolder ' remember the RootFolder. End If Next On Error Resume Next ' Some PST stores can not be ' removed, lets ignore errors For i=1 to Ubound(f) If Not f(i) Is Null Then ' If this is a RootFolder, o.Session.RemoveStore f(i) ' remove the store. End If Next