VisualBasic(Outlookマクロ:WScript.ShellでのPowershellの呼び出し)

■Outlook起動時に動かすマクロでPowershellのファイルを実行する。
前回、Outlook起動やメール受信時でのマクロ実行ができたので、実務的な処理を考えたい。それにあたって、PowershellやPythonなど外部ファイルを実行できた方が応用の幅が広がりそうなので、今回、マクロでのPowershellの呼び出しを試してみる。
Webで実行方法を探してみると、WScript.Shellを使った記事がいろいろと出てきたので、それらを参考にサンプルを作った。
内容は、受信トレイ内のメール数を取得、引数としてPowershellに受け渡した後、Powershellでメッセージを編集してマクロに戻し、メッセージボックスとして出力するというもの。

コードは次の通り。
Powershell部分 (ファイルパスは、C:\Users\user01\Web\it\visualbasic\test.ps1)

Param([String]$num) 
echo ("Mail Item Number is " + $num)

Outlookのマクロ部分

Private Sub Application_Startup()
 
 
 '***************************************************************
    Dim Shell As Object
    Dim objExec As Object
    Dim str As String
    Dim myItem As Object
    Dim myFolder As Folder
    Dim foldersize As Integer
    Dim Command As String
 
    Set myNameSpace = Application.GetNamespace("MAPI")
    Set myFolder = myNameSpace.GetDefaultFolder(olFolderInbox)
    foldersize = myFolder.Items.Count
    Command = "powershell C:\Users\user01\Web\it\visualbasic\test.ps1 " & foldersize
    Set Shell = CreateObject("Wscript.Shell")
    Set objExec = Shell.Exec("%ComSpec% /c" & Command)
    Do Until objExec.StdOut.AtEndOfStream
       str = str + objExec.StdOut.ReadLine + vbCrLf
    Loop
       MsgBox str, vbMsgBoxSetForeground
 '***************************************************************

End Sub

コマンドラインからPowershellを実行する形となるが、ここで、Commandに入力するものがコマンドラインで実行される文字列。Shell.Exec("%ComSpec% /c" & Command)で、その文字列を実行。Do Until - Loopで、実行結果(Powershellからの出力)を変数strに代入。

%ComSpec%は環境変数らしく、cmd.exeが入っており、/c はそれ以降の文字列を指定コマンドとみなすオプション。コマンドプロンプトのヘルプなどから確認できた。


実行結果は、下の通り。
メッセージボックスを表示した際に、Outlookの起動画面の背面に表示されたので、vbMsgBoxSetForegroundで前面に出すようにしている。

簡単ながら、Powershellへのデータの受け渡しと戻しが確認できた。
複雑な処理は、Outlookのマクロ編集でデバッグを行うより開発環境のソフトが入っているPowershellやPythonで行いたい。