適材適所

パソコン作業の自動化・効率化のための情報を発信するブログ(VBA,PowerShellなど)

PowerShellでNotesを操作する

  • この記事ではPowerShellを使ってNotesを操作する方法を解説しています。
  • Notesメールの取得を試みています。

PowerShellでNotesを操作する

何度かVBAによるNotes操作の記事を書いていまして、COMオブジェクトを使えばPowerShellからもNotes操作できるよね、ということで私なりにPowerShellを使ってNotesを操作する方法を調べてみましたので書いていきたいと思います。

「PowerShellでNotesを操作する」という需要があるかどうかわかりませんが・・・。
誰かの役に立つことを願って書き残します。

PowerShellからNotesを操作するためには、NotesのCOMオブジェクトを使います。 NotesのCOMオブジェクトを操作するためには、32bitのPowerShellを使う必要があるとのこと。
64bitのWindows10であれば、スタートメニューの「WindowsPowerShell」の中に「WindowsPowerShell(x86)」があります。

Lotus.NotesSessionを使う

32bitのPowerShellで次の通り実行します。

PS C:\> $notesSession=New-Object -ComObject Lotus.NotesSession

すると、$notesSessionのCOMオブジェクトが使えるようになります。
せっかくなのでこのオブジェクトの中身を少し見てみましょう。 Get-Memberに渡してみます。 f:id:shinmai_papa:20190914124820p:plain

いっぱいありますね~・・。

私は、いつもinitializeメソッドとGetDataBaseメソッドしか使っていないにわかなのでで他にどんな使い方があるのか、よく知りません・・・。勉強中です・・・。

PowerShellでNotesメールを取得する

では例として、この記事で紹介した手順でメールの一覧を取得してみましょう。

www.tekizai.net

とにもかくにも、まずはinitializeしてみます。

PS C:\> $notesSession.Initialize(パスワード)

これでNotesにつながりました。 ユーザー名を指定してつなぎたい場合は、InitializeUsingNotesUserNameメソッドを使いましょう。

メールアプリケーションにアクセスします。

PS C:\>$db=$notesSession.GetDatabase("サーバ名","○○.nsf")

次に最初の文書を$doc変数に格納して・・・

PS C:\> $doc=$db.AllDocuments.GetFirstDocument()

これで$doc変数に格納できました。

次は、この文書の次の文書を取得してみましょう。 上の記事のやり方だと、

PS C:\>$db.AllDocuments.GetNextDocument($doc)

これで次の文書が取得できるはず・・・。

実行!!

PS C:\> $db.AllDocuments.GetNextDocument($doc)
Document is not from this collection
発生場所 行:1 文字:1
+ $db.AllDocuments.GetNextDocument($doc)
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo: OperationStopped: (:) [], COMException
+ FullyQualifiedErrorId : System.Runtime.InteropServices.COMException

なんと!!エラーが発生してしまいました。

どうすれば、メールの一覧が取得できるのでしょうか・・・。

仕方がないので、GetNextDocumentの代わりになりそうなものを探してみると、GetNthDocumentメソッドというのが使えそうです。
引数に文書の順番を渡すことで該当の文書が取得できるようです。

これを使えば、ループですべてのメールにアクセスできそうだ!!

PS C:\> for($i=1;$i -le $db.AllDocuments.count;$i++){
>> $doc=$db.AllDocuments.GetNthDocument($i)
>> $doc.GetItemValue("Subject")
>> }

これで全メールの件名が取得できました!!よかった。

しかし、IBMのヘルプを見ると、よくないことが書いてあります・・・。

使用法
パフォーマンス上の理由により、GetNthDocument を使用してループを繰り返すことは避けてください。推奨されるループ構造については、GetDocument、GetFirstDocument、GetLastDocument、GetNextDocument、GetPrevDocumentを参照してください。
『IBM Knowledge Center』のGetNthDocumentより引用

何かパフォーマンス的によろしくないようですが・・・。
もし、もし、これを見られた方でGetNextDocumentメソッドを使ってループする方法をご存知の方がおりましたら教えてください。

おわりに

PowerShellでNotesの操作は、ちょっとしたことをやるのに便利かも知れないですね。 メールの一覧をCSVにしたり、カレンダーの予定をCSVにしたり・・・ってCSVばっかりじゃん!!

ここまでお読みいただき、ありがとうございました。

参考サイト

IBM Knowledge Center