Почему этот сценарий powershell не удаляет все электронные письма Outlook, на которые были даны ответы?

Я пишу этот сценарий, чтобы удалить любые сообщения Exchange, помещенные в карантин, на которые уже ответил другой техник.

Он "работает", но удаляет только первый набор электронных писем, на которые он нашел ответ, оригинал и ответ.

Если я запускаю сценарий второй раз, он удаляет следующий набор и так далее.

Я не понимаю, почему он не просматривает и не удаляет все письма, на которые были даны ответы, а не только первый набор.

#connect to outlooks
$outlook = new-object -comobject “Outlook.Application”
$mapi = $outlook.getnamespace(“mapi”)

#connect to outlook inbox
$inbox = $mapi.GetDefaultFolder(6)

#find the subfolder named Exchange Quarantined
$subfolder = $inbox.Folders | Where-Object {$_.Name -eq “Exchange Quarantined”}

#loop through emails and if someone already replied to the email then delete all emails with that users name in it
ForEach ($email in $subfolder.Items) {
    $subject = $email.Subject

    #Get the users name out of the subject line
    $user = $subject.Split("(")
    $name = $user[0] -replace ".*device that belongs to "
    $name = $name.Trim()
    Write-host $name
    if($subject -like "*RE: A device that belongs to*") {
        ForEach ($emailDelete in $subfolder.Items) {
            $subjectDelete = $emailDelete.Subject

            if($subjectDelete -like "*$name*") {
                Write-Host "Delete $subjectDelete"
                $emailDelete.Delete()
            }
        }
    }
}

Когда я впервые запустил скрипт, в папке было пять электронных писем, три исходных карантинных письма и два ответа. Вот выходные данные трех прогонов, которые при каждом прогоне удаляли только первый найденный набор ответов.

PS H:\> C:\Users\todd.welch\Downloads\Exchange Quarantined.ps1
Lan Fill
Adam Pac
Adam Pac
Delete A device that belongs to Adam Pac (adam.pac) has been quarantined. Exchange ActiveSync will be blocked until you take action.
Delete RE: A device that belongs to Adam Pac (adam.pac) has been quarantined. Exchange ActiveSync will be blocked until you take action.

PS H:\> C:\Users\todd.welch\Downloads\Exchange Quarantined.ps1
Lan Fill
Antonia Gonz
Antonia Gonz
Delete A device that belongs to Antonia Gonz (antonia.gonz) has been quarantined. Exchange ActiveSync will be blocked until you take action.
Delete RE: A device that belongs to Antonia Gonz (antonia.gonz) has been quarantined. Exchange ActiveSync will be blocked until you take action.

PS H:\> C:\Users\todd.welch\Downloads\Exchange Quarantined.ps1
Lan Fill

1 ответ

Решение

Никогда не удаляйте элементы коллекции в цикле "foreach" - вы изменяете коллекцию, и это заставляет ваш код пропустить хотя бы некоторые элементы. Используйте цикл "вниз" вниз (от Items.Count до 1).

При этом никогда не следует явно сопоставлять элементы в вашем собственном коде - используйте Items.Find/FindNext или же Items.Restrict, Пусть поставщик магазина сделает всю работу.

Другие вопросы по тегам