2014-09-15 5 views
0

Мне интересно, есть ли способ получить расширение файла из вложения в общую папку?Powershell: Как получить расширения файлов вложений в общих папках

Backgroud: Мы используем программное обеспечение (AttachmentsProcessor), который извлекает все вложения из электронной почты в структуре общих папок и сохранить его в файловой системе. Программное обеспечение помещает .lnk в сообщение электронной почты, которое указывает на местоположение в файловой системе. Поэтому мы можем открыть приложение двумя щелчками.

В последнее время мы переместили структуру общих папок с внутреннего Exchange на Office365/Exchange Online. Во время этого процесса мы пытались вернуть все извлеченные вложения обратно в электронные письма. После того как мы сделали некоторые тесты, мы заметили, что это не сработало для некоторых электронных писем. У нас еще есть .lnk как приложение.

Итак, что я ищу? Я хотел бы написать сценарий в PowerShell, который показывает мне список всех сообщений электронной почты и соответствующих папок (Identites), которые имеют прикрепленный файл .lnk.

В моем поиске я только что нашел что-то, что работает для почтовых ящиков, но ничего для общих папок.

-> Get-Mailbox | Export-Mailbox -AttachmentFilenames "* .PDF"

-> Get-Mailbox | New-MailboxExportRequest -ContentFilter {Attachment-like "* .PDF"}

Любая помощь будет очень приятной. ;-)

Спасибо за внимание Питер

ответ

0

я не могу открыто писать весь код для вас. Но у меня есть кое-что, что может заставить вас начать. Этот скрипт будет рекурсивно перебирать ваши общие папки и находить элементы, на которых есть вложения. Последний бит кода внутри цикла в настоящее время сохраняет файлы на диск, но вы можете заменить его какой-то логикой, чтобы сделать то, что вам нужно, чтобы сделать (например, фильтрацию с помощью вложения, вытягивание информации о ссылках и т. Д.).

$TargetDirectory = "C:\temp\PublicFolders" 

function process-folders-recursive($folder, $path) { 
    if($folder.DefaultMessageClass -ne "IPM.Appointment" -and $folder.DefaultMessageClass -ne "IPM.Contact") 
    { 
     $path = (Join-Path $path $folder.name) 
     write-host $folder.class $path 
     if($folder.Items.Count -gt 0){ 
      foreach($item in $folder.Items){ 
       if($item.MessageClass -ne "IPM.Appointment") 
       { 
       #Write-Host $item.name 
       if($item.Attachments.Count -gt 0) { 
        if(!(Test-Path -path $path)){ 
         New-Item -ItemType directory -Path $path 
        } 
        foreach($attch in $item.Attachments){ 
         try 
          { 
          Write-Host $attch.FileName 
          $fileName = $attch.FileName 
          $fileNameAndPath = (Join-Path $path $fileName) 
          $attch.saveasfile($fileNameAndPath) 
         } 
         catch [System.Exception] 
         { 
          Write-Host $path $fileName # $_.Exception.ToString() 
         } 
        } 
        } 
       } 
      } 
     } 
     $folder.Folders | ForEach { process-folders-recursive $_ $path} 
    } 
} 

$objOutlook = New-Object -comobject outlook.application 
$objNamespace = $objOutlook.GetNamespace(“MAPI”) 

#Get Outlook folder with name Public Folders 
$publicFolders = $objNamespace.Folders | Where { $_.name.StartsWith("Public Folders") } | Select -f 1 

#Go into the "All Public Folders" folder 
$AllPublicFolders = $publicFolders.Folders | Where { $_.name -eq "All Public Folders" } | Select -f 1 

#Recurse through the Public Folders 
process-folders-recursive $AllPublicFolders $TargetDirectory 
+0

Hey HAL9256, Вау, это больше, чем я ожидал. ;-) Ваш скрипт отлично работает. Приветствия –

+0

Добро пожаловать! – HAL9256