Войти

Показать полную графическую версию : Find по разным условиям


dosperados
03-02-2012, 10:16
Написал поиск в Outlook`e по разным условим


$oOutlook = New-Object -ComObject Outlook.Application
$oNameSpace = $oOutlook.GetNamespace("MAPI")
$oMAPIFolder = $oNameSpace.GetDefaultFolder(3)
$cContacts = $oMAPIFolder.Items

# Сам поиск
$cContactForDel = @()

$del | % {
$N=$_.Name; $M=$_.Mail; $D=$_.Department; $T=$_.Title; $C=$_.Company
Write-Verbose "Удаляем $N $M $D $T $C"
$cContactForDel += $cContacts.Find("[LastName] = ""$N"" AND [Email1Address] = ""$M"" OR [LastName] = ""$N"" AND [Department] = ""$D"" OR [LastName] = ""$N"" AND [JobTitle] = ""$T"" OR [LastName] = ""$N"" AND [CompanyName] =""$C"" OR [Email1Address] = ""$M"" AND [Department] = ""$D"" OR [Email1Address] = ""$M"" AND [JobTitle] = ""$T"" OR [Email1Address] = ""$M"" AND [CompanyName] =""$C"" ") }

Переменная $del массив с n`ным кол-вом объектов в нем и свойствами этих объектов.

Хотел организовать поиск по совпадению двух параметров.
логика была такая:
найти объект
[LastName] = ""$N"" AND [Email1Address] = ""$M"" если объекта с сочетанием таких полей нету продолжаем поиск по следующему сочетанию
или
[LastName] = ""$N"" AND [Department] = ""$D""
или
[Email1Address] = ""$M"" AND [Department] = ""$D""
и т.д.

у меня реализованная мной поисковая логика не работает (видимо нельзя так писать, как я это сдела)
ошибка:
Произошла ошибка при вызове метода, так как [System.__ComObject] не содержит метод с именем "op_Addition".
строка:70 знак:19
+ $cContactForDel += <<<< $cContacts.Find("[LastName] = ""$N"" AND [Email1Address] = ""$M"" OR [LastName] = ""$N"" AND [Departme
nt] = ""$D"" OR [LastName] = ""$N"" AND [JobTitle] = ""$T"" OR [LastName] = ""$N"" AND [CompanyName] =""$C"" OR [Email1Address] =
""$M"" AND [Department] = ""$D"" OR [Email1Address] = ""$M"" AND [JobTitle] = ""$T"" OR [Email1Address] = ""$M"" AND [CompanyNam
e] =""$C"" ") }
+ CategoryInfo : InvalidOperation: (op_Addition:String) [], RuntimeException
+ FullyQualifiedErrorId : MethodNotFound

Kazun
03-02-2012, 11:11
$oMAPIFolder = $oNameSpace.GetDefaultFolder(3)
$cContacts = $oMyMAPIFolder.Items

Почему две разные переменные?

$cContactForDel - Что за переменная?

dosperados
03-02-2012, 12:05
$oMAPIFolder = $oNameSpace.GetDefaultFolder(3)
$cContacts = $oMyMAPIFolder.Items
Почему две разные переменные?
$cContactForDel - Что за переменная? »
Выдергиваю маленькую часть скрита, поэтому не доглядел.
$oMyMAPIFolder исправил на $oMAPIFolder

$cContactForDel переменнай в которой хранится объект для дальнейшего удаления его

Kazun
03-02-2012, 12:21
Вот теперь,покажите ошибку,которая выдается.
И конакты - GetDefaultFolder(3) - разве не 10?

dosperados
03-02-2012, 12:25
да 10, но я удаляю из папки удаленные! папка удаленные - 3
можно показать пример и на папке 10... не пренципиально

Все я нашел ошибку, я забыл указать $cContactForDel = @(). (ОПЯТЬ моя невнимательность)
поэтому выдавал такую ошибку.
Kazun, Я сделал правильно? Или опять же можно проще реализовать?

dosperados
03-02-2012, 12:44
Kazun, Хотя я ошибался есть разница при поиске в папке удаленные (3) и в папке контакты (10)
Так как в папке удаленные присутствует много различного радо объектов - письма, папки и контакты.

Но не у каждого объекта в этой папке есть свойство [Email1Address] - получается что при поиске в объекте где нет такого поля выдает ошибку:
Исключение при вызове "Find" с "1" аргументами: "Свойство "Email1Address" неизвестно."
строка:33 знак:42
+ $cContactForDel += $oMAPIFolderDel.Find <<<< (" [Email1Address] = ""$M"" ")
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : ComMethodTargetInvocation

dosperados
07-02-2012, 12:01
Есть ли способ искать в массиве объектов, если у каждого объекта разный набором свойств?

Kazun
07-02-2012, 12:14
Как вариант отфильтровать,только по заданному типу,скажем Контакт,а дальше использовать операторы сравнения PowerShell,я думаю здесь скорость особо не критична.




© OSzone.net 2001-2012