Удаление папок в MS Outlook

feedsВ стародавние времена, когда я участвовал в бета-тестировании Office 2007, я очень обрадовался появлению в Outlook функционала RSS ридера. Разумеется сразу импортировал туда все свои фиды (а их у меня тогда было много), и попытался использовать. Не понравилось 😦 Почему – это отдельная тема, и к посту отношения не имеет. Короче говоря стал я читать RSS не в Outlook, а в Google Reader. Однако настройки RSS в Outlook и сами сообщения видимо мигрировали по моим системам вместе с профилем (корпоративный Exchange), и в какой то момент, папки с сообщениями продублировались. Потом еще раз. Меня это мало волновало, я просто сворачивал папку RSS Feeds и не обращал внимания на то что там происходит.

Сейчас я тестирую уже Office 2010. Новый Outlook при запуске, в момент подготовки профиля, показал мне количество элементов в моём ящике. Это было какое то огромное число, в котором я даже не успел сосчитать разряды. Я удивился что Outlook еще работает, да притом так шустро, и решил изучить – где же всё это добро копится. Поиск был несложным, основной помойкой оказалась папка RSS. Удалить сами подписки было несложно, но вот папки с сообщениями остались на месте. Я сначала начал удалять их по одной, но мне этот процесс быстро надоел. Del удаляет сообщения из ящика, и на папки не работает. То есть на каждой папке надо щелкнуть правой кнопкой мыши, выбрать Remove Folder (где то в середине контекстного меню), и затем еще подтвердить удаление. А папок от RSS у меня осталось очень много, и процесс грозил затянуться на час. И я решил воспользоваться PowerShell 😉

Я не писал скрипта, а делал всё интерактивно из консоли. Сначала подключаемся к Outlook с помощью COM интерфейса:

$outlook = New-Object -com outlook.application
$ns = $Outlook.GetNamespace("MAPI")

Теперь надо перебрать список стандартных папок, и выяснить ID папки RSS. Папки в Outlook адресуются по ID, из за того что название на разных языках может отличаться, а вот ID останется тем же.

1..30 | 
select @{n="ID";e={$_}}, @{n="Name"; e={$ns.getdefaultfolder($_).name}} | 
?{$_.name}| ft -a

В результате получился вот такой красивый список стандартных папок Outlook (привожу весь, вдруг вам нужна другая папка 😉 )

ID Name
-- ----
 3 Удаленные
 4 Исходящие
 5 Отправленные
 6 Входящие
 9 Календарь
10 Контакты
11 Дневник
12 Заметки
13 Задачи
16 Черновики
18 All Public Folders
19 Конфликты
20 Ошибки синхронизации
21 Локальные ошибки
22 Ошибки сервера
23 Нежелательная почта
25 RSS Feeds
28 To-Do List

Теперь можно поместить нужную нам папку в переменную:

$Rss = $ns.getdefaultfolder(25)

Для обращения к элементам папки обычно используется её массив .Items содержащий дочерние элементы. Но в моём случае мне надо было обратиться к массиву .folders для перебора папок. Перебирая все папки по очереди, я решил выводить название папки (иначе долго и скучно), и уже затем вызывать метод .Delete(). Заняло это одну строчку:

$rss.Folders | %{$_.Name; $_.delete()}

Это заняло минут 10, и еще примерно столько же ушло на написание этого поста 😉

Опубликовано в PowerShell, Scripting. Метки: , , . 8 комментариев »