Почему этот сценарий 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
, Пусть поставщик магазина сделает всю работу.