PowerShell から com を呼ぶ ~ Windows 7 で MSAgent!
突然ですが2009年12月14日付のBINGトップ画像。た、たまりませんな…。「もきゅー」とか言ってますよ。
さて、Microsoft Agentについては、このBLOGで何度か扱いました。
覚えてますか? Microsoft Agent ...
https://blogs.technet.com/junichia/archive/2007/10/12/microsoft-agent.aspx
Windows 7では Microsoft Agent のサポートが無くなり、とてもがっかりな気分で毎日を過ごしていました。ところが、なんてことでしょう。以下のKBによれば、修正プログラムで旧来のアプリケーションを救済することができるようです。
Microsoft Agent 対応のプログラムが Windows 7 で動作しない(機械翻訳)
https://support.microsoft.com/kb/969168
ただし、本文にも書かれている通り、この修正モジュールはこれまで使用していたMicrosoft Agent対応のアプリケーションを救済するためのものであり、決してWindows 7上で動作するMicrosoft Agent対応のアプリケーションを開発するためのものではありません。
それを心に留めつつ、せっかくなので PowerShell からの COM 呼び出しを覚えがてら遊んでみましょう。手元に遊び用のWindows 7を用意してください。VHD Bootで作るとよいですね。
【準備1】MS Agentのインストール
※脅すわけではありませんが、くれぐれも動作がおかしくなっても困らないマシンで試してください!
まずは以下のページ中段にある「Microsoft Agent Core Component」をダウンロードしてインストールしてください。
https://www.microsoft.com/PRODUCTS/msagent/main.aspx
ただし、インストール終了のメッセージは表示されず、以下の画面が表示されますので、「このプログラムは正しくインストールされました」を選択してください。
この状態でMicrosoft Agentを起動しようとすると、以下ように「80040154」エラーが表示されてしまいます。これは、MS Agent がWindows7に対応していないためです。
【準備2】Win7用 MS Agent コアコンポーネントを上書きインストール
以下をクリックして画面の上にある「修正プログラムのダウンロード」から修正モジュールを要求してください。メールでリンクが返ってきますので、ダウンロードしてインストールしましょう。64ビット用の32ビット用が用意されているので注意してください。
この修正モジュールにより、モジュール類がWindows 7対応のものに置き換わります。この修正モジュールだけインストールしたのでは、必要なレジストリエントリ等が書き込まれませんので注意してください。かならず【準備1】が必要です。
修正モジュールのインストールが完了したら、Windows PowerShell のコンソールを起動し、以下のコマンドを入力してみてください。
PS C:\> $objAgent = new-object -com Agent.Control.2 PS C:\> エラーを含め、何もメッセージが出なければインストールは正常に完了しています。
【さっそく実験】
さっそく使ってみましょう。ここで、「あれ?キャラクターデータはインストールしないの?」と思った方は、Microsoft Agent に慣れている方です。でも大丈夫です。修正モジュールには魔法使いの「Merlin」が標準で入っています。
PowerShellコンソールを起動し、可能ならば「スピーカーも有効に」しておいてください。
以下を 1行ずつ PowerShell コンソールにコピペしてみてください。
$objAgent = new-object -com Agent.Control $objAgent.Connected = 1 [void]$objAgent.Characters.Load("Merlin","C:\windows\msagent\chars\merlin.acs") $objMerlin = $objAgent.Characters.Character("Merlin") [void]$objMerlin.Show() 最後の行(Show())を実行した際に、画面左上にMerlinが「ぼわっ」と表示されれば成功です。
上記のスクリプトを VBScriptに置き換えると以下のようになります。簡単ですね。CreateObject は「new-object」、戻り値が無い処理には[void]を使うといったことを理解できれば、ひとまずなんてことはありません。
Set objAgent = CreateObject("Agent.Control") objAgent.Connected = TRUE objAgent.Characters.Load "Merlin", "C:\Windows\MSAgent\chars\Merlin.acs" Set objMerlin = objAgent.Characters.Character("Merlin") objMerlin.Show
VBScript と比較して PowerShell のよいところは、1行ずつ実行した結果が見られることです。これは、Microsoft Agent のようなアニメーションを操作するアプリの場合にはとても便利です。VBScriptじゃ専用のエディタを使ってブレークポイントを設定しないと出来なかったですし、スクリプトの実行中に処理を追加したり変更してやり直すなんてことはできませんでした。
以下、1行ずつ実行してみましょう。
#Merlinに「Hello」としゃべらせる [void]$objMerlin.Speak("Hello!")
#画面上を座標100,100に移動させる [void]$objMerlin.MoveTo(100,100)
#水晶を使って探し物の動作をさせる [void]$objMerlin.Play("Search")
#Merlinに永遠に書き物をさせる [void]$objMerlin.Play("Writing") #書き物からの復帰 [void]$objMerlin.Stop()
#Merlinを画面上から消す [void]$objMerlin.Hide() どうでしょう?PowerShellって便利ですよね。VBScriptのころは面倒だった1つ1つの動作確認が簡単にできます。
以下のページにはMerlinで使えるアニメーションリストが掲載されていますので参考にしてください。
Merlinのアニメーションリスト
https://msdn.microsoft.com/en-us/library/ms695930(VS.85).aspx
Merlin以外のキャラクターをインストールするには、以下からダウンロードしてください。https://www.microsoft.com/PRODUCTS/msagent/main.aspx
その他の各キャラクターのアニメーションリスト
https://msdn.microsoft.com/en-us/library/ms695821(VS.85).aspx