2011年10月24日月曜日

ThinApp / App-V 任意のコマンドを実行する方法


ThinApp / App-V 任意のコマンドを実行する方法



仮想アプリの実行前等に任意のコマンドを
実行したいことが多々あるかと思います。

アプリ実行前にBatファイルを実行したり
VBScript を実行したいといったニーズがあります。
(仮想レジストリを変更したり、仮想ファイルシステムにあるファイルを変更したりと)


両製品ともに、柔軟にコマンドの実行ができるので、その方法を簡単に書きたいと思います。



事前準備:
予めCドライブの下にtestフォルダーを作成し仮想アプリから呼び出したい、
以下の2つのファイルを用意しておきます。
・start.bat
・end.vbs











start.batの内容
echo off
echo "START BAT!"
pause

end.vbsの内容
MsgBox "END VBS!"


仮想アプリ起動”前”にC:\test\start.batを実行します。
仮想アプリ終了”後”にC:\test\end.vbsを実行します。

【 ThinApp の場合の設定方法】
組込スクリプトを利用します。
プロジェクトフォルダに以下の VBScript ファイルを作成した後に、
Build.batを実行します。

sample.vbsの内容

Function OnFirstParentStart()
  Call WaitForProcess(ExecuteVirtualProcess("cmd.exe /c c:\test\start.bat"),0)
End Function
Function OnFirstParentExit()
  ExecuteVirtualProcess("wscript.exe c:\test\end.vbs")
End Function

簡単な解説:
OnFirstParentStart は実行前にVOSから呼ばれる CallbackFunction です。
OnFirstParentExit は仮想アプリの終了後

ExecuteVirtualProcess は ThinApp 独自のAPIです。指定したパラメータを仮想環境で実行します。
物理環境で実行したい場合は、ExecuteExternalProcess を利用します。

WaitForProcess は起動したプログラムの終了を待ちます。
「0」はタイムアウトしないで、ずっと待つ意味

参考:
http://pubs.vmware.com/thinapp4/help/wwhelp/wwhimpl/js/html/wwhelp.htm?href=ThinApp_User_s_Guide.html



【 App-V の場合の設定方法】
OSDファイルを編集します。
青字部分を追加します。

<DEPENDENCY>
 <CLIENTVERSION VERSION="4.6.0.0"/>
    <SCRIPT EVENT="LAUNCH" PROTECT="TRUE" TIMING="PRE" WAIT="TRUE">
      <HREF>cmd.exe /c c:\test\start.bat</HREF>
    </SCRIPT>
    <SCRIPT EVENT="SHUTDOWN" TIMING="POST">
      <HREF>wscript.exe c:\test\end.vbs</HREF>
    </SCRIPT>
 </DEPENDENCY>


簡単な解説:
EVENT:ストリーム、起動、終了を指定できます。
PROTECT:仮想環境で実行する場合はTRUE、物理環境で実行する場合はFALSE
※コマンドの実行結果を仮想環境のみ反映させたい場合はTRUEにすることが多いです。
物理環境に反映させたい場合は、FALSEにします。
WAIT:コマンドの終了を待ってから仮想アプリケーションを動かす場合はTRUE
大文字小文字などに注意してください。

参考:
http://blogs.technet.com/b/appv/archive/2007/10/11/scripting-within-an-osd-file.aspx


実行結果:

App-V 4.6SP1で確認しています。
ThinApp 4.6.2で確認しています。