フォルダ内のメールを全削除できない [powershell/Outlook]
Q&A
Closed
初めての質問になります。お分かりの方いらっしゃれば、教えていただきたいです。
powershellにてOutlookを操作し、メールに対する処理と削除をしようとしています。
具体的には、任意のフォルダからメールを取り出し、コピーなどの処理をした後に削除する、というループを作成しています。
コピーなどの処理のみを記載しループさせていた時は、フォルダ内の全てのメールに対して処理が実施されていたのですが、メールの削除部分を追記したところ、一部メールに対して処理と削除がされていないにも関わらず正常終了するようになってしまいました。
作成したコード
$outlook = New-Object -ComObject Outlook.Application
$myNamespace = $outlook.GetNamespace("MAPI")
$myInbox = $myNamespace.GetDefaultFolder(olFolderInbox)
$folder = $myInbox.Folders('フォルダ名')
foreach($item in $folder.Items){
## コピーなどの処理 ##
# 削除の処理
$item.delete()
}
処理だけされず削除される、もしくはその逆、ということはなく、途中でループを抜けているような挙動をしています。
またフォルダ内にメールが10通ある時に実行すると、4件のメールが処理と削除されず残り、再度実行すると1件だけ残る、というように何となく規則性があるように見受けられます。(ただし4件で実行した時は2件メールが残るような時もありました。)
オブジェクト数の変化が気になったので試しにフォルダ内のメールを10通にし、Items内のオブジェクト数がどのように変化しているか確認したところ、下記のような結果になりました。
オブジェクト数を確認するコード
foreach($item in $folder.Items){
Write-Host $folder.Items.Count
## コピーなどの処理 ##
# 削除の処理
$item.delete()
}
結果
10
9
8
7
6
5
一つずつ減っている点に関しては想定通りなのですが、オブジェクト数が0でないにも関わらずなぜループから抜けてしまっているのはよくわかっておりません。
実現したいことは、処理後にフォルダーを空にする、ということです。
前述の作成状況などを踏まえまして、この実現方法についてお分かりでしたら教えていただきたいです。
またpowershellおよびOutlookの操作に関して初学者になりますので、コード上の誤り、メソッドの認識や他メソッドのご助言などありましたらご教示お願いします。
よろしくお願いします。