TechBlog

Teknik och filosofi

Script för att stänga alla öppna PST-filer

inga kommentarer

En kollega behövde ett script för att stänga alla öppnade PST-filer i Outlook. Google gav följande träff:

http://blogs.technet.com/b/messaging_and_beyond/archive/2012/05/10/scripting-remove-all-pst-files-in-an-outlook-profile.aspx

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



Av kalle

september 5th, 2012 at 6:38 e m

Kommentera