Событие PowerShell Outlook расширенного поиска завершено - PullRequest
0 голосов
/ 07 февраля 2019

В сценарии PowerShell я хочу провести исследование локальных почтовых сообщений Windows.

У меня есть следующий сценарий:

Add-type -assembly "Microsoft.Office.Interop.Outlook" | out-null

$outlook = New-Object -com Outlook.Application;

$namespace = $outlook.GetNamespace("MAPI");

Function Get-OutlookInbox {

    $accountsList = $namespace.Folders

    $query = "Test"
    $filter = "urn:schemas:httpmail:subject LIKE '"+$query+"'"

    foreach($account in $accountsList) {
        write-host "SEARCHING IN MAILBOX : " $account.name

        $scope = $account.FolderPath

        $search = $outlook.AdvancedSearch("'$scope'", $filter, $True)

        Start-Sleep -Seconds 10

        foreach ($result in $search.Results) {
            $result.Subject
            $result.ReceivedTime
            $result.SenderName
        }

    }

$inbox = Get-OutlookInbox

$inbox

Хорошо работает благодаря Start-Sleep -Seconds 10 как$outlook.AdvancedSearch функция асинхронная, мне не очень нравится этот способ разработки, немного дурацкий.

Я хотел бы использовать AdvancedSearchComplete Событие, но я не знаю, какиспользуйте его в PowerShell, а документация для VBA.Я не очень хорош в разработке PowerShell, не могу найти способ сделать это.

Спасибо за вашу помощь!

1 Ответ

0 голосов
/ 12 февраля 2019

Я наконец-то нашел решение самостоятельно, выкладываю его ниже, оно может пригодиться кому-то в будущем:

Я использовал PowerShell Register-ObjectEvent , чтобы подписаться на событие AdvancedSearchComplete

Смотрите мой обновленный скрипт:

Add-type -assembly "Microsoft.Office.Interop.Outlook" | out-null
$outlook = New-Object -com Outlook.Application;
$namespace = $outlook.GetNamespace("MAPI");

Register-ObjectEvent -InputObject $outlook -EventName "AdvancedSearchComplete" -Action {
    Write-Host "ADVANCED SEARCH COMPLETE" $Args.Scope

    if ($Args.Results) {  
        foreach ($result in $Args.Results) {
            write-host "=================================================="
            write-host $result.Subject
            write-host $result.ReceivedTime
            write-host $result.SenderName
            write-host "=================================================="
        }
    }
}

Function Get-OutlookInbox {

    $accountsList = $namespace.Folders

    $query = "Test"
    $filter = "urn:schemas:httpmail:subject LIKE '%"+$query+"%'"

    foreach($account in $accountsList) {
        $scope = $account.FolderPath

        $search = $outlook.AdvancedSearch("'$scope'", $filter, $True)

    }
}

Get-OutlookInbox
...