Я пытаюсь извлечь вложения из Outlook, которые соответствуют шаблону senderemailaddress
. Как видно из приведенного ниже кода, я пытаюсь использовать два фильтра, но безрезультатно.Прочтите вложения из Outlook, которые относятся к определенному отправителю с помощью подстановочных знаков
Когда я использую некомментированный фильтр, который в данный момент активен в коде, код не вызывает никаких ошибок и не загружает вложения, соответствующие тестовому примеру. Однако, если я активирую прокомментированный фильтр и запускаю его, я получаю следующую ошибку.
Exception calling "Restrict" with "1" argument(s): "Cannot parse condition. Error at "like"." At C:\Users\acer\Desktop\outlook.ps1:42 char:2 + $filteredItems = $folder.items.Restrict($filter) + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : NotSpecified: (:) [], MethodInvocationException + FullyQualifiedErrorId : ComMethodTargetInvocation
Код:
$filepath = "C:\folder\subfolder\subsubfolder\"
function downloadFiles {
$filter = "[UnRead]=true AND [SenderEmailAddress] -match @example"
#$filter = "[UnRead]=true AND [SenderEmailAddress] -like '*@example*'"
Add-Type -Assembly "Microsoft.Office.Interop.Outlook" | Out-Null
$olFolders = "Microsoft.Office.Interop.Outlook.olDefaultFolders" -as [type]
$outlook = New-Object -ComObject Outlook.Application
$namespace = $outlook.GetNameSpace("MAPI")
$folder = $namespace.GetDefaultFolder($olFolders::olFolderInBox)
#$folder.Items | select SenderEmailAddress
$filteredItems = $folder.Items.Restrict($filter)
foreach ($objMessage in $filteredItems) {
$intCount = $objMessage.Attachments.Count
if ($intCount -gt 0) {
for ($i=1; $i -le $intCount; $i++) {
$objMessage.Attachments.Item($i).SaveAsFile($filepath+$objMessage.Attachments.Item($i).FileName)
}
}
$objMessage.Unread = $false
}
$outlook.Close
}
downloadFiles
Edit1: Спасибо всем за советы. Я смог сделать это, выполнив фильтрацию с непрочитанным = true и шаблоном, сопоставляющим senderemailaddress с свойствами отфильтрованных писем.
Добавление модифицированного кода:
$filepath = "C:\folder\subfolder\subsubfolder\"
function downloadFiles {
$filter="[UnRead]=true"
$emailfilter = "*@xyz.co.in"
$subjectfilter = "test file*"
Add-Type -Assembly "Microsoft.Office.Interop.Outlook" | Out-Null
$olFolders = "Microsoft.Office.Interop.Outlook.olDefaultFolders" -as [type]
$outlook = New-Object -ComObject Outlook.Application
$namespace = $outlook.GetNameSpace("MAPI")
$folder = $namespace.GetDefaultFolder($olFolders::olFolderInBox)
#$folder.Items | select SenderEmailAddress
$filteredItems = $folder.Items.Restrict($filter)
foreach ($objMessage in $filteredItems) {
$subject = $objMessage.Subject
$emailaddress = $objMessage.SenderEmailAddress
if(($emailaddress -like $emailfilter) -and ($subject -like $subjectfilter)){
$intCount = $objMessage.Attachments.Count
if ($intCount -gt 0) {
for ($i=1; $i -le $intCount; $i++) {
$objMessage.Attachments.Item($i).SaveAsFile($filepath+$objMessage.Attachments.Item($i).FileName)
}
}
$objMessage.Unread = $false
}
else {continue}
}
$outlook.Close
}
downloadFiles
Теперь проблема планирования этого сценария? Когда я запускаю этот скрипт, используя путь powershell в командной строке, он работает нормально. Но когда я планирую то же самое, это не завершается. Я мог видеть процесс Outlook, созданный диспетчером задач в TaskManager, и должен вручную убить процесс для его завершения. Есть идеи?
я неспособен access isread свойство в скрипте, даже если оно отображается в списке свойств объекта. Ant предложения –
$ items | select * показывает isread свойство как часть элементов –
Что делает '$ items [0] .IsRead' yield? – TechSpud