Массовое переименование папок Outlook с помощью строк замены

#vba #powershell #outlook

#vba #powershell #outlook

Вопрос:

Сейчас мне поручено выполнить масштабный проект по импорту и реорганизации около 50 pst-архивов Outlook (вероятно, около 100-200 ГБ) в единую учетную запись библиотеки для моей транспортно-экспедиционной компании.

Я использую компьютер с Windows 10 Pro с установленным на локальном компьютере Office 365 Business Premium, а Outlook использует текущую версию «Exchange Online» 15.20.xxxx.xx, поэтому все доступно в облаке.

Импорт архивов не является проблемой.

Моя проблема в том, что мне приходится переименовывать несколько тысяч папок Outlook, чтобы они были упорядочены!

Конечная цель — переименовать все папки электронной почты, начиная с полного номера файла, установленного программным обеспечением нашей компании для этой поставки:

 CHI-AE0xxxxx (air export)
CHI-AI0xxxxx (air import)
CHI-OE0xxxxx (ocean export)
CHI-OI0xxxxx (ocean import)
CHI-DO0xxxxx (domestic)
  

где x являются числовыми и теперь должны состоять из 6 чисел

До сих пор не существовало структуры именования, поэтому каждый использует то, что имеет смысл в его личном мозгу. Вот несколько примеров:

 CHOIxxxxx
CHOI0xxxxx
CHIOIxxxxx
CHIOI0xxxxx
  

или просто xxxxx (я буду знать, какой префикс нужно прикрепить к папкам этого пользователя)

Итак, в основном, что я хочу сделать, это заменить «CHOI» или «CHIOI» на «CHI-OI», а затем, если там 5 цифр, превратить его в 6 цифр с начальным 0.

У меня большой опыт работы с Excel VBA и макросами. Я довольно хорошо использую Powershell с базами данных Excel и SQL Server.

У меня нет опыта работы с Outlook и / или попыток манипулировать им с помощью внешних инструментов, таких как VBA или Powershell, но я готов учиться!

Комментарии:

1. С чем именно вам нужна помощь? Вам нужно что-то попробовать, а затем опубликовать с конкретным вопросом, касается ли это переименования папки в Outlook (см., например. vbaexpress.com/forum /… ) или как привести существующие имена папок к требуемому стандарту (который является простым VBA, а не специфичным для Outlook)

2. Можете ли вы написать скрипт, который просматривает каждое имя файла и выводит текущее имя файла и то, каким вы хотели бы его видеть? Это было бы хорошей отправной точкой. По крайней мере, у вас было бы что опубликовать в вопросе, чтобы у кого-то могли возникнуть предложения.

Ответ №1:

Оказывается, Outlook VBA был способом решения этой задачи.

Вчера я, наконец, нашел отличный ответ:

https://www.datanumen.com/blogs/batch-find-replace-specific-words-outlook-folder-names/

Мне пришлось немного изменить код, заменив:

 Set objFolders = Outlook.Application.Session.Folders("Personal").Folders
  

Таким образом, он выполняет поиск / изменяет только вложенные папки в папке, которую я выбрал в данный момент:

 Set objFolders = Outlook.Application.ActiveExplorer.CurrentFolder.Folders
  

Вот (почти) готовый код:

 Public strFind, strReplace As String

Sub FindReplaceWordsinFolderNames()

    Dim objFolders As Outlook.Folders
    Dim objFolder As Outlook.Folder

    Set objFolders = Application.ActiveExplorer.CurrentFolder.Folders

    'You need to input the specific words for find and replace
    strFind = InputBox("Enter the specific words you want to change.")
    strReplace = InputBox("Enter the specific words you want to change to. (Case Sensitive)")

    For Each objFolder In objFolders
        Call ProcessFolders(objFolder)
    Next

    MsgBox "Complete!", vbExclamation, "Rename Folders"

End Sub

Private Sub ProcessFolders(ByVal objCurrentFolder As Outlook.Folder)
    Dim objSubfolder As Outlook.Folder

    On Error Resume Next
    If InStr(LCase(objCurrentFolder.Name), LCase(strFind)) > 0 Then
       'Find and replace the specific words
       objCurrentFolder.Name = Replace(LCase(objCurrentFolder.Name), LCase(strFind), strReplace)
    End If

    'Process all folders recursively
    If objCurrentFolder.Folders.Count > 0 Then
       For Each objSubfolder In objCurrentFolder.Folders
           Call ProcessFolders(objSubfolder)
       Next
    End If
End Sub
  

В нем нет никакой проверки ошибок, поэтому, если я нажму «Отмена» в поле ввода или оставлю его пустым и нажму «ок», макрос будет действовать так, как будто «» — это strFind , поэтому он затем переводит все имена папок в нижний регистр, lol.

Я думаю, что добавление этого сразу после двух полей ввода решит проблему, но я протестирую это завтра:

     If strFind = "" Or strReplace = "" Then
        Exit Sub
    End If
  

Это решение кажется мне действительно хорошим, поскольку мне нужно обратиться к такому множеству вариантов строк поиска, что жесткое кодирование каждой из них было бы кошмаром. Вместо этого это позволит мне на лету подстраиваться под то, как работал мозг каждого пользователя, когда они годами разрабатывали свои персональные структуры именования.

После просмотра и использования этого я затем разработал другой макрос для пакетного перемещения всего из выбранного каталога в любую папку, в которую я хочу их объединить … чтобы создать свою настоящую библиотеку файлов, но это другая тема, поэтому, я полагаю, вы не хотите, чтобы это публиковалось здесь.