【问题标题】:Powershell - Outlook Mark all mails as read then deletePowershell - Outlook 将所有邮件标记为已读然后删除
【发布时间】:2014-09-09 19:52:44
【问题描述】:

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

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

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

$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
}

【问题讨论】:

    标签: email powershell outlook exchange-server


    【解决方案1】:

    我建议使用MailItem.Delete() method 而不是将内容移至“已删除邮件”文件夹。从 Delete() 方法页面:

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

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

    有了这些知识,我建议用以下内容替换您的 ForEach 循环:

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

    我不明白为什么必须对集合进行子表达式才能枚举它,但我从来没有这样做过指定记录。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2019-07-19
        • 2013-02-02
        • 1970-01-01
        • 2014-10-19
        • 2015-05-20
        • 2015-07-30
        • 2013-05-07
        • 2013-06-07
        • 1970-01-01
        相关资源
        最近更新 更多