none
VS2005のセットアッププロジェクトにて、カスタム動作のVBSが動作しない RRS feed

  • 質問

  • 山口と申します。

     

    VS2005のセットアッププロジェクトにて、カスタム動作にオリジナルのVBSファイルを組み込んだのですが、

    実際のインストール/アンインストール時になぜかこのVBSが動作しません。

    • 同じPC上にて、VBS単体では正常に動作することを確認済みです。
    • VBSにMsgBoxを組み込んでみても、セットアップ時には全く表示されていないため、VBS自体が正常に呼び出されていないようです。
    • 組み込んだVBSは必ず起動するようにConditionプロパティはTrueにしてあります。

    「この辺を確認してみたら…」など、なにか参考情報をご存知の方がいれば、宜しくご教授願います。

     

    関連して、以下追加質問です。

    • カスタム動作の「インストール」と「確定」の違いが今ひとつよくわかりません(MSDNはもちろん参照済ですが…)。
      • 「インストール」はセットアップ(内部)の一番最後に実行される。
      • 「確定」は、セットアップ自体の完了後に、例えば「OSを再起動する」「別のアプリを稼動する」などの場合に使用する。

    という解釈で間違いないでしょうか?

    • 「アンインストール」は当然「アンインストールされると発生」するわけですが、これって自己矛盾(削除されたファイルを実行する)に陥らないのでしょうか?

    -以上-

    2008年2月11日 23:45

回答

  • IIJIMASさん、度々のご教授ありがとうございます。
    以下のご指摘がヒントになって、本件の原因がやっとわかりました。

     

     IIJIMAS さんからの引用

    そのVBSでインストールファイルの何かを処理しているのでしょうか?
    その場合インストールディレクトリの絶対パスが必要だと思いますが…パスを正しく渡せていますでしょうか?

    たとえば、
    カスタム動作のプロパティウィンドウで
    CustomActionDataに[TARGETDIR]と記述して
    vbs側では
    Property("CustomActionData")
    をつかって、インストールディレクトリの絶対パスが取得できます。

    ご指摘どおり、VBSでインストールされた雛形ファイルに対してFileSystemObjectにて色々処理しています。
    ここで、VBS自体も同じフォルダにインストールされている(Excludeプロパティ=False)ので、
    FSOのGetAbsolutePathName(".")にて自身がインストールされたフォルダを特定しています。
    実際、VBS単体で動作させた場合は、前述のとおり、これで何の問題もなく動作していました。

     

    ところが、インストール中にこのVBSをカスタム動作させた場合は、なんと GetAbsolutePathName(".") が
    Windowsのsystem32フォルダを指してしまっているのです……そりゃ期待通りに動かないわけだ…orz

    まず「ファイルシステム」エディタに追加してから「カスタム動作」指定しかも「確定」なんだから、
    インストール先パスで動作する、とふつーは思うでしょ>>MSさん…

     

    ご指摘いただいた方法 Session.Property("CustomActionData") にて、インストール中にインストール先パスを
    VBS側で取得できることも確認しました。

    でも、このVBSはインストール後も使用する予定で、VBS単体で動作すると「Sessionが定義されていない」旨の

    エラーになるんですよね…(もちろん On Error で回避できますが、美しくない…)

     

    これで本件は解決済みとさせていただきます。ありがとうございました。
    -以上-

    2008年2月13日 1:21

すべての返信

  •  山口 さんからの引用

    VS2005のセットアッププロジェクトにて、カスタム動作にオリジナルのVBSファイルを組み込んだのですが、

    実際のインストール/アンインストール時になぜかこのVBSが動作しません。

    まず、過去スレッド「カスタム動作でVBScriptを設定するとうまく動いてくれません。 - MSDN フォーラム」

    http://forums.microsoft.com/MSDN-JA/ShowPost.aspx?PostID=1664769&SiteID=7

    をご確認ください。

     山口 さんからの引用

    • 組み込んだVBSは必ず起動するようにConditionプロパティはTrueにしてあります。

    必ず起動するようにするにはConditionプロパティ何も入力しなくてよいと思いますが。

     山口 さんからの引用

    関連して、以下追加質問です。

    • カスタム動作の「インストール」と「確定」の違いが今ひとつよくわかりません(MSDNはもちろん参照済ですが…)。
      • 「インストール」はセットアップ(内部)の一番最後に実行される。
      • 「確定」は、セットアップ自体の完了後に、例えば「OSを再起動する」「別のアプリを稼動する」などの場合に使用する。

    という解釈で間違いないでしょうか?

    • 「アンインストール」は当然「アンインストールされると発生」するわけですが、これって自己矛盾(削除されたファイルを実行する)に陥らないのでしょうか?

    「インストール」はファイル等のインストール前のタイミングで、「確定」はファイル等のインストールが成功した後のタイミングだと思います。

    「アンインストール」…すいません、私も調べてみないとわかりませんが、たぶん大丈夫なのではないかと思います。(実行時は削除されていない…)

     

    簡単なサンプルを作成して試されてみてはどうでしょうか?
    2008年2月12日 4:09
  •  山口 さんからの引用

    • カスタム動作の「インストール」と「確定」の違いが今ひとつよくわかりません(MSDNはもちろん参照済ですが…)。
      • 「インストール」はセットアップ(内部)の一番最後に実行される。
      • 「確定」は、セットアップ自体の完了後に、例えば「OSを再起動する」「別のアプリを稼動する」などの場合に使用する。

    という解釈で間違いないでしょうか?

    • 「アンインストール」は当然「アンインストールされると発生」するわけですが、これって自己矛盾(削除されたファイルを実行する)に陥らないのでしょうか?

    カスタム動作の解説は、MSI の持つ仕組みの一部しか取り込んでないので、説明があやふやなんですよね。

    なので、よく分かんねー...というのが出るのもある意味仕方のない面はあるかと。

     

    さて、質問の「インストール」と「確定」の違いですが、

    カスタム動作(MSIの本来持つ、Custom Actions とは同名の別機能ととらえておいたほうがいいです)には、

    1. 実際のインストール作業の前に行う処理
    2. 実際のインストール作業中に行う処理
    3. 実際のインストール作業の後に行う処理
    4. ロールバック(2の部分にのみ適用)時に行う処理

    の4つの処理があります。

    アンインストールは、上記の部分の「インストール」と書かれているところに「アン」とつけて読み替えてください。
    #実際にはインストーラの識別情報としてアンインストールのときのみというのはありません。

     

    詳しくは...SDKのリファレンスかな?英語ですがリンクはっておきます。

    http://msdn2.microsoft.com/en-us/library/aa368066(VS.85).aspx

     

    2008年2月12日 7:36
  • あ、肝心な部分入れるの忘れてた。

    上記のうち、「インストール」に当たるものが2番。「確定」に当たるものが3番になります。

     

    2008年2月12日 7:37
  • IIJIMASさん、とっちゃんさん、早速のご教授ありがとうございます。山口です。

     

     IIJIMAS さんからの引用

    簡単なサンプルを作成して試されてみてはどうでしょうか?

    ご指摘のように、もう一度プロジェクトを新規作成して、まず単純なVBS(MsgBox一行のみ)で試してみました。
    結果、「インストール」「確定」「アンインストール」いずれも正常に動作しました。
    また「アンインストール」時に自己矛盾は起こりませんでした(当然といえば当然ですが…)。
    …でも、いずれも進行ゲージの途中で発生して(つまりMSDNの説明と違う)、

    「インストール」「確定」は連続発生して違いが全然わからない…orz

     

     とっちゃん さんからの引用

    カスタム動作の解説は、MSI の持つ仕組みの一部しか取り込んでないので、説明があやふやなんですよね。
    なので、よく分かんねー...というのが出るのもある意味仕方のない面はあるかと。

    さて、質問の「インストール」と「確定」の違いですが、
    カスタム動作(MSIの本来持つ、Custom Actions とは同名の別機能ととらえておいたほうがいいです)には、

    1. 実際のインストール作業の前に行う処理
    2. 実際のインストール作業中に行う処理
    3. 実際のインストール作業の後に行う処理
    4. ロールバック(2の部分にのみ適用)時に行う処理
    の4つの処理があります。

    アンインストールは、上記の部分の「インストール」と書かれているところに「アン」とつけて読み替えてください。
    #実際にはインストーラの識別情報としてアンインストールのときのみというのはありません。

    詳しくは...SDKのリファレンスかな?英語ですがリンクはっておきます。
    http://msdn2.microsoft.com/en-us/library/aa368066(VS.85).aspx

    上記のうち、「インストール」に当たるものが2番。「確定」に当たるものが3番になります。


    とっちゃんさん、フォローと詳細な解説ありがとうございます。リンク先の英語版も現在参照中です。

     

     IIJIMAS さんからの引用

    まず、過去スレッド「カスタム動作でVBScriptを設定するとうまく動いてくれません。 - MSDN フォーラム」
    http://forums.microsoft.com/MSDN-JA/ShowPost.aspx?PostID=1664769&SiteID=7

    過去ログを確認しました。
    今回問題になっている私のVBSでは、
    ・Scripting.FileSystemObject … インストールされた雛形ファイルの操作用
    ・WScript.Shell … 環境変数設定用
    を使用していますが、いずれもオブジェクト作成はもともと Set X = CreateObject("...") としています。

     

    で、色々試行していて気付いたのですが、どうやらインストール(ファイルコピー)が「本当に完了する前」に
    VBSが実行されているのが原因のようです。「インストール」でも「確定」でも同じでした。

     IIJIMAS さんからの引用

    必ず起動するようにするにはConditionプロパティ何も入力しなくてよいと思いますが。

    Conditionプロパティを未入力のままだと、上記のFileSystemObjectによる雛形ファイル操作用VBS実行時に
       このWindowsインストーラパッケージには問題があります。
       このインストールを完了するのに必要なスクリプトを実行できませんでした。
    とのメッセージが出てインストールに失敗するのです。
    ConditionプロパティをTrueにしたのはこのためです。

     

    …期待通り、ファイルコピー等がホントに完了してから「カスタム動作」に登録されたVBSが起動すれば問題ないはずなのですが…
    現在、VBS側の調整で何とかできないか思案中です。
    その他の情報があれば、引き続きお待ちしています。

    2008年2月12日 10:09
  •  山口 さんからの引用

    ご指摘のように、もう一度プロジェクトを新規作成して、まず単純なVBS(MsgBox一行のみ)で試してみました。
    結果、「インストール」「確定」「アンインストール」いずれも正常に動作しました。
    また「アンインストール」時に自己矛盾は起こりませんでした(当然といえば当然ですが…)。
    …でも、いずれも進行ゲージの途中で発生して(つまりMSDNの説明と違う)、

    「インストール」「確定」は連続発生して違いが全然わからない…orz

    簡単なスクリプトではうまくいったとのことであれば、本題のスクリプトにそれを近づけていけばよいのではないでしょうか。

     山口 さんからの引用

    で、色々試行していて気付いたのですが、どうやらインストール(ファイルコピー)が「本当に完了する前」に
    VBSが実行されているのが原因のようです。「インストール」でも「確定」でも同じでした。

     山口 さんからの引用

    …期待通り、ファイルコピー等がホントに完了してから「カスタム動作」に登録されたVBSが起動すれば問題ないはずなのですが…
    現在、VBS側の調整で何とかできないか思案中です。
    その他の情報があれば、引き続きお待ちしています。

    そのVBSでインストールファイルの何かを処理しているのでしょうか?

    その場合インストールディレクトリの絶対パスが必要だと思いますが…パスを正しく渡せていますでしょうか?

     

    たとえば、

    カスタム動作のプロパティウィンドウで

    CustomActionDataに[TARGETDIR]と記述して

    vbs側では

    Property("CustomActionData")

    をつかって、インストールディレクトリの絶対パスが取得できます。

     

    …関係なかったらすいません。
    2008年2月12日 10:50
  • IIJIMASさん、度々のご教授ありがとうございます。
    以下のご指摘がヒントになって、本件の原因がやっとわかりました。

     

     IIJIMAS さんからの引用

    そのVBSでインストールファイルの何かを処理しているのでしょうか?
    その場合インストールディレクトリの絶対パスが必要だと思いますが…パスを正しく渡せていますでしょうか?

    たとえば、
    カスタム動作のプロパティウィンドウで
    CustomActionDataに[TARGETDIR]と記述して
    vbs側では
    Property("CustomActionData")
    をつかって、インストールディレクトリの絶対パスが取得できます。

    ご指摘どおり、VBSでインストールされた雛形ファイルに対してFileSystemObjectにて色々処理しています。
    ここで、VBS自体も同じフォルダにインストールされている(Excludeプロパティ=False)ので、
    FSOのGetAbsolutePathName(".")にて自身がインストールされたフォルダを特定しています。
    実際、VBS単体で動作させた場合は、前述のとおり、これで何の問題もなく動作していました。

     

    ところが、インストール中にこのVBSをカスタム動作させた場合は、なんと GetAbsolutePathName(".") が
    Windowsのsystem32フォルダを指してしまっているのです……そりゃ期待通りに動かないわけだ…orz

    まず「ファイルシステム」エディタに追加してから「カスタム動作」指定しかも「確定」なんだから、
    インストール先パスで動作する、とふつーは思うでしょ>>MSさん…

     

    ご指摘いただいた方法 Session.Property("CustomActionData") にて、インストール中にインストール先パスを
    VBS側で取得できることも確認しました。

    でも、このVBSはインストール後も使用する予定で、VBS単体で動作すると「Sessionが定義されていない」旨の

    エラーになるんですよね…(もちろん On Error で回避できますが、美しくない…)

     

    これで本件は解決済みとさせていただきます。ありがとうございました。
    -以上-

    2008年2月13日 1:21