首页 > 解决方案 > 将多个项目从一个 Outlook 文件夹移动到另一个文件夹的问题 - Powershell

问题描述

我正在尝试通过 mapi 寻址从 Outlook 收件箱文件夹中选择多封电子邮件,并希望将这些电子邮件的副本移动到同一收件箱中的另一个文件夹。

不幸的是,我的脚本似乎随心所欲,有时会复制 6 封电子邮件,然后因以下失败而停止,有时会在第一封电子邮件时停止。

失败:

... "veeam")} | ForEach-Object {$_.Copy().Move($Namespace.Folders.Item("$ ... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : OperationStopped: (:) [ForEach-Object], COMException + FullyQualifiedErrorId : System.Runtime.InteropServices.COMException,Microsoft.PowerShell.Commands.ForEachObjectCommand

我找不到任何解决方案,我坐在这里很困惑,因为在另一个邮箱中代码工作得很好。

当然,我是在预先设置$Mailbox变量$TempWorkPath

在此先感谢您的帮助。

尝试在 foreach 循环中运行代码性能较差,并以同样的问题结束。

大约 3 个小时的谷歌搜索根本没有帮助我。

只是移动对象会导致代码中断,可能是因为索引?

Add-Type -Assembly "Microsoft.Office.Interop.Outlook"
$OutlookSession = New-Object -ComObject Outlook.Application
$Namespace = $OutlookSession.GetNameSpace("MAPI")
$Namespace.Folders.Item("$Mailbox").Folders.Item("Posteingang").Items.Restrict('[UnRead] = True') | Where-Object {($_.Subject -match "ackup") -or ($_.SenderEmailAddress -match "veeam")} | ForEach-Object {$_.Copy().Move($Namespace.Folders.Item("$Mailbox").Folders.Item("Posteingang").Folders.Item("$TempWorkPath"))} | Out-Null

<# 使用选定/复制的电子邮件执行操作 #>

[System.Runtime.Interopservices.Marshal]::ReleaseComObject($OutlookSession) | Out-Null
$OutlookSession = $null | Out-Null

在理论上,基于我在另一个文件夹中的测试,这应该可以正常工作,创建电子邮件的副本,将其移动到我的文件夹,然后我可以用它做事。

标签: powershelloutlook

解决方案


好吧,我想我找到了解决这个问题的方法。在 while 循环而不是 foreach 循环中运行命令似乎效果更好。

$Inbox = $Namespace.Folders.Item("$Mailbox").Folders.Item("Posteingang").Items.Restrict('[UnRead] = True') | Where-Object {($_.Subject -match "ackup") -or ($_.SenderEmailAddress -match "veeam")}

$MailCounter = $Inbox.Count
$HelperForCounting = 0

while ($MailCounter -gt $HelperForCounting)
{
    $Inbox[$MailCounter].Copy().Move($Namespace.Folders.Item("$Mailbox").Folders.Item("Posteingang").Folders.Item("$TempWorkPath"))
    $MailCounter = $MailCounter - 1
}

问候


推荐阅读