在尝试解决这个问题时遇到了一些问题。 出于某种原因,我的脚本无法正常工作。
它应将收件箱文件夹中的所有邮件标记为已读,然后将其删除。 但是,当脚本运行时,它只会删除.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
}
答案 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。