处理 e-mails 时无法选择(无法过滤)collection
Can't make selection (can't filter) of collection while processing e-mails
我想创建一些 e-mail 处理的自动化。
我关注了 this article,效果很好。总而言之,我的其中一个邮箱有 collection 个 e-mail,但是我无法过滤它们(无法提供 where
方法)。我可以使用 foreach
运算符,但在我看来这不是一个最好的主意(比如使用游标功能来过滤 SQL 中的表值而不是使用 'where' 选项)。
Add-Type -Assembly "Microsoft.Office.Interop.Outlook"
$Outlook = New-Object -comobject Outlook.Application
$namespace = $Outlook.GetNameSpace("MAPI")
$inbox = $namespace.GetDefaultFolder([Microsoft.Office.Interop.Outlook.OlDefaultFolders]::olFolderInbox)
$mailsInEventFolder = $inbox.Folders.Item('Events').Items
通过执行最后一条命令,我得到了 e-mail 中的 collection(collection 中的 System.MarshalByRefObject
)。 where{$_ -eq ...}
等常见 collection 的常用方法在这里不起作用。
如果我尝试 where
方法,我会收到一条错误消息 "MethodNotFound"。此外,我无法使用 Get-Member
命令获取此 collection 的所有方法的列表,因为它为我提供了 e-mail object 的方法,而我需要 [=58] 的方法=].
我知道为此 collection 我可以使用以下内容:
$mailsInEventFolder.Item(int32)
$mailsInEventFolder.Item(string)
$mailsInEventFolder.Count
$mailsInEventFolder.Add(obj)
$mailsInEventFolder.Remove(int32)
我在文档中搜索这个正确的 object collection 浪费了很多时间,但是我没有成功。
请给我一些建议,如何在不使用 foreach
的情况下,根据 e-mail object 的某些 属性 的值过滤我的 e-mail。或者请给我正确的参考描述 collection object.
我好笨:(
我要找的是:
$mailsInEventFolder | ? {$_.SenderName -eq 'SomeName'}
对不起你的时间。
您需要使用 Items.Find/FindNext or Items.Restrict。
不要循环遍历文件夹中的项目以寻找匹配项(这就是您的代码所做的)——每个项目都需要打开。让商店供应商来做繁重的工作。
我之前的回答很好,但是在处理 500 多封电子邮件时速度很慢。所以我找到了另一个解决方案:
Items.Restrict("[SentOn]>'21/12/2015 00:01'")
restrict 选项允许使用过滤选项([senton] - 属性 of email object)。而且速度快一百倍!
这里有一些关于它的文档:
https://msdn.microsoft.com/en-us/library/bb220369(v=office.12).aspx
(请注意,并非本文中的所有内容都适用于 PS)。
不客气:)
我想创建一些 e-mail 处理的自动化。
我关注了 this article,效果很好。总而言之,我的其中一个邮箱有 collection 个 e-mail,但是我无法过滤它们(无法提供 where
方法)。我可以使用 foreach
运算符,但在我看来这不是一个最好的主意(比如使用游标功能来过滤 SQL 中的表值而不是使用 'where' 选项)。
Add-Type -Assembly "Microsoft.Office.Interop.Outlook"
$Outlook = New-Object -comobject Outlook.Application
$namespace = $Outlook.GetNameSpace("MAPI")
$inbox = $namespace.GetDefaultFolder([Microsoft.Office.Interop.Outlook.OlDefaultFolders]::olFolderInbox)
$mailsInEventFolder = $inbox.Folders.Item('Events').Items
通过执行最后一条命令,我得到了 e-mail 中的 collection(collection 中的 System.MarshalByRefObject
)。 where{$_ -eq ...}
等常见 collection 的常用方法在这里不起作用。
如果我尝试 where
方法,我会收到一条错误消息 "MethodNotFound"。此外,我无法使用 Get-Member
命令获取此 collection 的所有方法的列表,因为它为我提供了 e-mail object 的方法,而我需要 [=58] 的方法=].
我知道为此 collection 我可以使用以下内容:
$mailsInEventFolder.Item(int32)
$mailsInEventFolder.Item(string)
$mailsInEventFolder.Count
$mailsInEventFolder.Add(obj)
$mailsInEventFolder.Remove(int32)
我在文档中搜索这个正确的 object collection 浪费了很多时间,但是我没有成功。
请给我一些建议,如何在不使用 foreach
的情况下,根据 e-mail object 的某些 属性 的值过滤我的 e-mail。或者请给我正确的参考描述 collection object.
我好笨:(
我要找的是:
$mailsInEventFolder | ? {$_.SenderName -eq 'SomeName'}
对不起你的时间。
您需要使用 Items.Find/FindNext or Items.Restrict。 不要循环遍历文件夹中的项目以寻找匹配项(这就是您的代码所做的)——每个项目都需要打开。让商店供应商来做繁重的工作。
我之前的回答很好,但是在处理 500 多封电子邮件时速度很慢。所以我找到了另一个解决方案: Items.Restrict("[SentOn]>'21/12/2015 00:01'")
restrict 选项允许使用过滤选项([senton] - 属性 of email object)。而且速度快一百倍!
这里有一些关于它的文档: https://msdn.microsoft.com/en-us/library/bb220369(v=office.12).aspx (请注意,并非本文中的所有内容都适用于 PS)。
不客气:)