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で行いたい。