airyan
@airyan (けーさ)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

フォルダ内のメールを全削除できない [powershell/Outlook]

初めての質問になります。お分かりの方いらっしゃれば、教えていただきたいです。


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の操作に関して初学者になりますので、コード上の誤り、メソッドの認識や他メソッドのご助言などありましたらご教示お願いします。
よろしくお願いします。

0

1Answer

Powershellでなく恐縮ですが、Outlook VBAで同様の事象を経験したことがあります。

OutlookアイテムでFor Each文を使用する際の不具合のようで、以下に書き換えて試したところ処理がスキップすることなく完了しました。
Powershellでも以下のような書き換えが可能でしたらぜひお試しください。

・For文で$folder.Items.Count to 1 という風にカウントダウンで処理を繰り返す

・Do Until で $folder.Items.Count が 0 になるまで処理を繰り返す

以下、Outlook VBAでFor Eachを使用すると処理がスキップする事象に関するリンクです。
非公式情報ですが参考までに…

1Like

Comments

  1. @airyan

    Questioner

    素早いご回答をありがとうございます。

    先ほどForeach文をFor文に書き換えて試したところ、期待通りに動かすことができました!
    powershellで動かす場合においても、Outlookアイテムに関する不具合が同様に起こりうるんですね。大変勉強になりました。

    またリンクも大変参考になりました。
    一つ目の方は特に自分と同じような状況だったので読んでいてなんだか安心しました笑

    改めてご助言いただきありがとうございました!
  2. PowerShellでも解決策となったようで安心しました^^
    こちらこそお試し頂きありがとうございました!

Your answer might help someone💌