VBScriptでLotusScriptを利用する
使い方を聞かれたので簡単にまとめてみました。
注意点にも記載しましたが、今後のことを考えると、ローカル環境でWindowsの機能を使いつつLotusScriptで何かしたい場合はWindows PowerShellで実装するのがお勧めです。
※PowerShellからLotusScirptのクラスを呼んだときのGetFirstDocumentの挙動について - Qiitaに記載しましたが、GetFirstDocumentの挙動がおかしいため、この問題が解消してからのほうがよいかもしれません。
概要
Component Object Model(COM)セッションを利用して Dominoオブジェクトへのアクセスが可能です。
DBに直接LotusScript書くほうが早そうですが、以下のようなメリットがあります。Windowsの各種機能と組み合わせてLotusScriptでNotesDBをつつけるので、色々と便利な場面があります。
- ユーザーのローカル環境から実行するときに、処理が終わるまでNotesクライアントが固まらない(バックグラウンドで実行できる)
- VBScript側で用意されている機能のいいとこ取りができる
- Windowsの機能のいいとこ取りもできる
- 例:ユーザーのローカル環境で定期的に実行させたいエージェントがあった場合に、Windowsのタスクスケジューラなどの機能を使って実行する
一方でデメリットもあります。
- フォアグラウンドのクラス(NotesUIWorkSpaceから派生するクラス、ユーザーインターフェースに関するクラス、など)は使えない
- バックグラウンドのクラスでもCOMでは使えないものもある
- IBM Notes/IBM Domino 上とCOMで実行したときで、挙動が異なるクラス・メソッドがある
上手く使えば仕事を楽にしてくれるので、知っていると便利です。
サンプルコード
VBScriptからLotusScriptのNotesSessionを利用する簡単なスクリプトはこちら。
' VBScriptでLotusScriptのクラスやオブジェクトを利用するためのシンプルな例
Option Explicit
' 初期設定
' 変数の設定
Dim objWsh ' バッチファイルをウィンドウ開かずに実行させるときに必要
Dim objSS ' NotesSessionクラスのオブジェクト
' Notesのセッションを用意する
' Initialize メソッドに引数を渡さないことで、デフォルトのパスワード入力ウィンドウを表示させる
Set objSS = WScript.CreateObject("Lotus.NotesSession")
Call objSS.Initialize
' NotesSession のプロパティを呼んでみる(今回はユーザー名の共通部分を出力してみる)
Wscript.Echo objSS.CommonUserName
上記コードを適当なフォルダに保存し、前提条件を満たした環境下で以下のように実行してあげると、ユーザー名の共通部分が表示されます。
C:\>C:\Windows\SysWOW64\CScript.exe //nologo sample.vbs
Hoge Fuga
注意点
64bit環境下では、32bit版のCScript.exe(またはWScript.exe)からVBSを呼ぶ必要があります。64bit環境下では通常64bit版のCScript.exeが呼ばれてしまうのですが、このCScript.exeではオブジェクトを作成できず、以下のようなエラーになります。
C:\>cscript //nologo sample.vbs
C:\sample.vbs(14, 1) WScript.CreateObject: "Lotus.NotesSession" というオブジェクトを作成できませんでした。
このため、上の例のように C:\Windows\SysWOW64\CScript.exe から実行する必要があるのですが、知らないとハマります。昔のコードが新しい環境で動かない……ということで焦ることになります。
#"WOW64"は"Windows-On-Windows 64"の略で、64bit Windows で 32bit Windows アプリケーションを動作させる仕組みのことなのだけど、見ただけならこっちが64bit版のCScript.exeだと思っちゃいますよね……。なんて分かり辛い。
また、VBScriptがいつ打ち切られてしまうか分からないため、そうなった場合はWindows PowerShell への移行を迫られることになります。
「Windows PowerShellでもLotusScriptを利用できるの?」という声が聞こえてきそうですが、できるので続きは後ほど……。
2017/10/22 追記:
だいぶ時間がたってしまいましたが、PowerShellからLotusScriptを呼び出す方法についてエントリを用意しました。
PowershellでLotusScriptを利用する - Qiita