Удаление дублей папок RSS в Outlook

Я недавно описывал как делается удаление всех папок из папки RSS в Outlook, но не все решили совсем отказаться от использования любимого Outlook’а в качестве RSS ридера 🙂 Некоторым надо лишь удалить дубликаты папок. Для этого надо добавить совсем немного изменений 🙂

$outlook = New-Object -com outlook.application
$ns = $Outlook.GetNamespace("MAPI")
$Rss = $ns.getdefaultfolder(25)
$rss.Folders | ?{$_.Name -match '\(\d+\)$'} | %{$_.Name; $_.delete()}

Однако будьте осторожны, таким образом будут удалены все папки заканчивающиеся на цифру в скобках, так что если у вас есть нужные папки с таким названием – сначала переименуйте их.

Кстати, при подключении к Outlook из сценариев, иногда возникает такое вот окно:

OutlookAutomation

Кто нибудь знает как можно его отключить?  Очень бы пригодилось для сценариев автоматизации Outlook запускаемых через планировщик.

Process Monitor – мониторинг включения системы

Те кто серьезно занимались внедрением Software Restriction Policy у себя в компании, наверняка задумывались что неплохо было бы не оставлять включенным стандартное правило разрешающее запуск любых программ из папки Windows. Ведь некоторые из этих программ могут предоставлять чрезмерно большие возможности пользователям. А то и чем черт не шутит – дадут возможность обойти SRP… Но чтобы убрать это правило, надо понять, какие же программы действительно необходимы для загрузки системы и для работы пользователя. Для того чтобы это узнать, можно воспользоваться утилитой Process Monitor от Microsoft Sysinternals.

 

Читать далее…

Удаление папок в 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 комментариев »

Перекладывание файлов в соответствии с бизнесс-процессами :)

Приношу извинения за слишком долгое отсутствие постов в блоге, лето, дела, <добавить прочие отмазы по вкусу>… Но забрасывать блог я разумеется пока не собираюсь, так что не торопитесь отписываться 🙂

Итак, совершенно случайно, на просторах интернета, я наткнулся на такую задачку — http://community.livejournal.com/ru_sysadmins/1134170.html. По условиям требовалось переместить файлы разложенные в структуре формата

x:\incoming\<year>\<month>\<date>\<<datatype>-<year>-<department>>\

на другой диск, в уже другом формате

y:\<year>\<department>\<datatype>\<<datatype>-<year>-<department>>\

К счастью задачка решалась достаточно несложно, и в комментах было произнесено слово PowerShell 😉 так что я быстренько набросал решение. Думаю технология может пригодиться не только автору, поэтому размещаю копию решения и здесь, с комментариями.

#Получаем содержимое папки x:\incoming и подпапок, выбираем только файлы, и для каждого из них...            
dir x:\incoming -recurse | where {! $_.psiscontainer} | foreach {            
    #Если его полный путь подпадает под регулярное выражение, то им же разбирается на компоненты            
    #Компоненты помещаются в специальный массив $matches            
    if ($_.fullname -match 'x:\\incoming\\([^\\]+)\\([^\\]+)\\([^\\]+)\\([^\-]+)-[^\-]+([^\\]+)\\')            
    {            
        #Присваиваем значения из $matches переменным с человекопонятными именами, для удобства            
        $year,$month,$date,$type,$departament = $matches[1..5]            
        #Составляем путь к новому каталогу для файла из этих переменных            
        $newpath = "y:\$year\$departament\$type\$type-$year-$departament"            
        #Если каталог еще не существует, то...            
        if (!(test-path $newpath))            
        {            
            #...создаём его            
            new-item -type directory $newpath -force            
        }            
        #Копируем файл в новое место с выводом информации на экран            
        copy $_ $newpath -verbose            
    }            
    else            
    {            
        #Если путь не подпал под регулярное выражение, то выводим предупреждение            
        write-warning "Path $($_.fullname) not match regular expression"            
    }            
}

Вот и всё. К сожалению не проверял, лень было создавать тестовую структуру, но вроде должно работать 🙂 Если встретите какие то ошибки – сообщайте 🙂