Почему этот сценарий powershell не удаляет все электронные письма Outlook, на которые были даны ответы? - PullRequest
0 голосов
/ 03 июля 2019

Я пишу этот сценарий, чтобы удалить любые карантинные электронные письма 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()
            }
        }
    }
}

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

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 Ответ

1 голос
/ 03 июля 2019

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

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

...