无法使用Outlook中的PowerShell迭代电子邮件对象

时间:2017-05-02 13:27:07

标签: powershell scripting outlook

我正在编写一个脚本,它将Outlook文件夹作为输入,并将每个未读邮件移动到不同的文件夹。我的代码:

Add-Type -assembly "Microsoft.Office.Interop.Outlook"
$Outlook = New-Object -ComObject Outlook.Application
$namespace = $Outlook.GetNameSpace("MAPI")
$olFolderInbox = 6
$inbox = $namespace.GetDefaultFolder($olFolderInbox)

$myFolder  = $namespace.pickfolder() 

$toFolder = $inbox.Folders | where-object { $_.name -eq "UnreadMessages" }
$messages = $myFolder.Items
$messageCount = $messages.count

for ($i = $messageCount - 1; $i -ge 0; $i--) 
{
    if ($messages[$i].unread -eq $True)
    {
         $message.move($toFolder)
    }
 }

问题是,我无法遍历“消息”对象。错误: 无法索引System.__ComObject类型的对象。

如果不可能,那我该怎么做呢? 提前谢谢。

EDIT。这是我使用PowerShell的第一天:)

4 个答案:

答案 0 :(得分:1)

尝试在其上执行get-member,并查看您的选项。

$Messages | Get-Member -force

如果您弄清楚如何继续,那么您可以使用ForEach-Object循环浏览$ Messages的内容,如下所示

$Messages | ForEach-Object { Script code }

或使用其缩写:

$Messages | % { Script code }

答案 1 :(得分:1)

所有Outlook集合都是1,而不是0 - 您需要从Items.Count迭代到1。

其次,不要只浏览文件夹中的所有消息,请使用Items.Find / FindNext。在您的情况下,搜索条件为"[Unread] = true"

答案 2 :(得分:0)

虽然无法使用PowerShell常用的索引语法 - $messages[$i] -  要访问$messages的元素,您可以文件夹对象上使用.Items($i) (请参阅the docs):

此外,如Dmitry Streblechenko's helpful answer所述,索引从1开始,而不是0

for ($i = $myFolder.Items.Count; $i -ge 1; $i--) 
{
    $message = $myFolder.Items($i)
    if ($message.unread)
    {
       $message.move($toFolder)
    }
 }

对于没有索引的简单正向枚举,您可以使用foreach

foreach ($message in $myFolder.Items) {
    if ($message.unread)
    {
       $message.move($toFolder)
    }
 }

$myFolder.Items | ForEach-Object { ... }也应该有效,但速度会慢一些。)

尽管如此,Dmitry's answer回答还指出如何在源执行过滤枚举,这样做的效果要好得多。

答案 3 :(得分:0)

感谢您的回复。你的所有答案都很有帮助。我终于使用了foreach循环。当我试图使用$message = $myFolder.Items($i)时出现以下错误:

Method invocation failed because [System.__ComObject] doesn't cont
ain a method named 'Items'

因此在这种情况下不可能使用索引进行迭代。

谢谢大家的时间:)