Событие PowerShell Outlook расширенного поиска завершено

В сценарии 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 ответ

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

Я использовал 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
Другие вопросы по тегам