В стародавние времена, когда я участвовал в бета-тестировании 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, и еще примерно столько же ушло на написание этого поста 😉