Powershell - Outlook将所有邮件标记为已读,然后删除

时间:2014-07-18 15:43:36

标签: email powershell outlook exchange-server

在尝试解决这个问题时遇到了一些问题。 出于某种原因,我的脚本无法正常工作。

它应将收件箱文件夹中的所有邮件标记为已读,然后将其删除。 但是,当脚本运行时,它只会删除.count $电子邮件显示的一半......

如何解决这个问题,我做错了什么?

$outlook = new-object -comobject outlook.application

#Define folders
$namespace = $outlook.GetNameSpace("MAPI")
$pst = $namespace.Stores
$pstRoot = $pst.GetRootFolder()
$pstFolders = $pstRoot.Folders
#$personal = $pstFolders.Items("ARCHIVE")  ##Not working, sadly.
$DefaultFolder = $namespace.GetDefaultFolder(6)
$InboxFolders = $DefaultFolder.Folders
$DeletedItems = $namespace.GetDefaultFolder(3)
$Emails = $DefaultFolder.Items

Foreach ($Email in $Emails) {
#Define folders
$Email.UnRead = $false
$Email.Move($DeletedItems) | out-null
continue
}

2 个答案:

答案 0 :(得分:3)

我建议使用MailItem.Delete() method而不是移动到Deleted Items文件夹。从Delete()方法页面:

  

删除方法会删除集合中的单个项目。删除所有   items在文件夹的Items集合中,您必须删除每个项目   从文件夹中的最后一项开始。例如,在项目中   文件夹的集合, AllItems ,如果有n个项目   该文件夹,开始删除 AllItems.Item(n)中的项目,递减   每次删除索引,直到您删除 AllItems.Item(1)

     

删除方法将项目从包含文件夹移动到   已删除邮件文件夹。如果包含的文件夹是已删除邮件   文件夹,删除方法会永久删除该项目。

有了这些知识,我建议用以下代码替换你的ForEach循环:

For($i=($emails.count-1);$i -ge 0;$i--){
    $($emails)[$i].Unread = $false
    $($emails)[$i].delete()
}

我不明白为什么你必须对集合进行子表达以便对其进行枚举,但是如果不这样做,我就无法指定一个记录。

答案 1 :(得分:2)

不要使用" foreach"循环,因为您正在修改集合中的项目数。使用Items.Count中的循环为1。