【问题标题】:Powershell...Moving emails to archive folder.....moves all but last email?Powershell ......将电子邮件移动到存档文件夹......移动除了最后一封电子邮件之外的所有电子邮件?
【发布时间】:2015-03-05 14:53:22
【问题描述】:

我正在尝试将 Outlook 中的电子邮件从一个文件夹移动到另一个文件夹。

但是,我的代码在处理最后一封电子邮件时抛出错误。

“无法索引到 System.__ComObject 类型的对象。”

它会将所有其他电子邮件移动到存档文件夹中。

如果仅存在 1 封电子邮件,则会出错.... 如果存在 2 封或更多封电子邮件,则它将移动除最后一封电子邮件之外的所有邮件,然后出错。

代码是

$filepath="Z:\"
$olFolderInbox = 6

$i=0 
$outlook = new-object -com outlook.application; 
$ns = $outlook.GetNameSpace("MAPI");
$inbox = $ns.Folders | ? { $_.Name -eq '#Whe ContractorRFPs' };
$trgtfldr = $inbox.Folders | ? { $_.Name -match 'Inbox' };
$mvdfldr = $inbox.Folders | ? { $_.Name -match 'Archived' };
$messages = $trgtfldr.items

    for($i=($messages.count -1);$i -gt -1;$i--){
    $($messages)[$i].move($mvdfldr)
    }

【问题讨论】:

  • 数组的索引是从 0 而不是 1。如果你改变你的逻辑来匹配它是否有效? for ($i=0; $i -le $intCount; $i++)
  • 出于同样的原因,您的第二个循环也可能需要进行类似的更改
  • 不起作用...将数组更改为 0 会破坏我的附件剥离(正常工作),产生的错误是使用“1”参数调用“项目”的异常:“数组索引超出范围。”
  • 好的...没有测试我会再试一次。您在子表达式中有 $messages 不是必需的。 $($messages)[$i].move($mvdfldr)难道不只是$messages[$i].move($mvdfldr)
  • 删除括号会导致循环中的所有电子邮件都不会被移动。

标签: email powershell


【解决方案1】:

你可以这样设置你的循环

$messages = $trgtfldr.items
$messageCount = $messages.count

for ($i = $messageCount - 1; $i -ge 0; $i--) {
    $message = $messages.GetLast()
    $message.move($mvdfldr)
}

【讨论】:

    【解决方案2】:

    为什么不使用 foreach 循环?

    $messages = $trgtfldr.items
    
    foreach($message in $messages){
     $message.move($mvdfldr)
    }
    

    【讨论】:

    • 这几乎可以工作...当我运行它时会发生以下情况...如果存在 4 封电子邮件,它将移动 2。如果存在 2 封电子邮件,它将移动 1,如果存在 1 封电子邮件,然后它将移动 1。因此对于 4 封电子邮件,该过程需要运行 3 次才能清除收件箱。
    • $messages 返回要移动的正确数量的电子邮件......但是它没有循环正确的次数
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-21
    • 2017-05-20
    • 2012-11-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多