Событие 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