質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Windows Installer XML

Windows Installer XML(WiX)はXMLソースコードからWindows導入パッケージを組めるツールセットです。このツールセットは、開発者がMSIとMSMセットアップパッケージを組むためにプロセスを統合する可能性のあるコマンドライン環境に対応しています。

Q&A

解決済

1回答

5861閲覧

【Wix】カスタムアクションで[TARGETDIR]が使えない

退会済みユーザー

退会済みユーザー

総合スコア0

Windows Installer XML

Windows Installer XML(WiX)はXMLソースコードからWindows導入パッケージを組めるツールセットです。このツールセットは、開発者がMSIとMSMセットアップパッケージを組むためにプロセスを統合する可能性のあるコマンドライン環境に対応しています。

0グッド

0クリップ

投稿2019/04/05 11:56

編集2019/04/05 11:58

目的・問題

WixとWix Editで、インストーラーを作っていますが、サイズが大きくなってしまったため、
インストーラーに7z.exeを同封して、ファイルサイズの大きいデーターは、
セットアップフォルダーと同じディレクトリに7z形式で保存し、
カスタムアクションでインストール中にインストール先のディレクトリの解凍するようにしました。
コマンドパラメータ↓
x -y -o[SourceDir] [SourceDir]pac\data.7z
しかし、何度もやってみましたが、
アーカイブの中身がインストール先のディレクトリに展開されませんでした。
どうやら、カスタムアクションの[TARGETDIR]プロパティを無視しているようです。
[SourceDir]プロパティは問題なく動いているようですが、なぜでしょうか?
どうすれば定数?で、インストール先のディレクトリを指定できるのでしょうか

問題のソースコード (Wix Editで作成されたもの+α)

xml

1<?xml version="1.0" encoding="utf-8"?> 2<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"> 3 <Product Id="8C686318-2089-41C2-A5E2-A189514A10D2" Name="TestProgram" Language="1041" Version="1.0.0" Manufacturer="TestProgram" UpgradeCode="FF5E6F91-7741-47EE-96BA-0D1D866FD170"> 4 <Package Description="Test file in a Product" Comments="Simple test" InstallerVersion="200" Compressed="yes" /> 5 <Media Id="1" Cabinet="simple.cab" EmbedCab="yes" /> 6 <Directory Id="TARGETDIR" Name="SourceDir"> 7 <Directory Id="ProgramFilesFolder" Name="PFiles"> 8 <Directory Id="TESTPROGRAM" Name="TestProgram"> 9 <Component Id="TESTPROGRAM.EXE" DiskId="1" Guid="DA034E91-7CE0-4C26-9267-7DB965E42778"> 10 <File Id="TESTPROGRAM.EXE" Name="TestProgram.exe" Source="TestProgram\TestProgram.exe"> 11 <Shortcut Id="desktopShortcut" Directory="DesktopFolder" Name="TestProgram" WorkingDirectory="INSTALLDIR" Advertise="yes" Icon="DesktopIcon.exe" IconIndex="0" /> 12 <Shortcut Id="ExeShortcut" Directory="ProgramMenuDir" Name="TestProgram" Advertise="yes" Icon="StartMenuIcon.exe" IconIndex="0" /> 13 </File> 14 </Component> 15 </Directory> 16 </Directory> 17 <Directory Id="DesktopFolder" /> 18 <Directory Id="ProgramMenuFolder"> 19 <Directory Id="ProgramMenuDir" Name="TestProgram"> 20 <Component Id="StartMenuShortcuts" Guid="29E132A7-2DAB-4E40-8094-0C215BF9EB31"> 21 <RemoveFolder Id="ProgramMenuDir" On="uninstall" /> 22 <RegistryValue Root="HKCU" Key="Software[Manufacturer][ProductName]" Type="string" Value="" /> 23 <Shortcut Id="UninstallProduct" Name="Uninstall" Description="Uninstalls the application" Target="[System64Folder]msiexec.exe" Arguments="/x [ProductCode]" /> 24 </Component> 25 </Directory> 26 </Directory> 27 </Directory> 28 <Feature Id="DefaultFeature" Title="Main Feature" Level="1"> 29 <ComponentRef Id="TESTPROGRAM.EXE" /> 30 <ComponentRef Id="StartMenuShortcuts" /> 31 </Feature> 32 <UI /> 33 <Property Id="WIXUI_INSTALLDIR" Value="TESTPROGRAM" /> 34 <UIRef Id="WixUI_InstallDir" /> 35 <Icon Id="DesktopIcon.exe" SourceFile="TestProgram\TestProgram.exe" /> 36 <Icon Id="StartMenuIcon.exe" SourceFile="TestProgram\TestProgram.exe" /> 37 <Binary Id="sevenz.exe" SourceFile="7z.exe" /> 38 <CustomAction Id="SevenZ" BinaryKey="sevenz.exe" ExeCommand="x -y -o[TARGETDIR] [SourceDir]\data.7z" Return="asyncWait" /> 39 <InstallExecuteSequence> 40 <Custom Action="SevenZ" After="InstallFiles" /> 41 </InstallExecuteSequence> 42 </Product> 43</Wix>

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

どうやら、カスタムアクションの[TARGETDIR]プロパティを無視しているようです。
[SourceDir]プロパティは問題なく動いているようですが、なぜでしょうか?

TARGETDIRプロパティは効いているはずです。ただ、それが質問者さんの求める値とは異なるかもしれません。そもそもTARGETDIRは主にドライブのルートディレクトリを指します。(定義からすると必ずしも「ドライブのルート」とは言えませんが)

Microsoft Docs - TARGETDIR property

読んでもなかなか分かりづらいですが、TARGETDIRは状況によって必ずしもC:ドライブを指しません。実際、私が試したときはE:\ドライブを示しました。(C:ドライブにWindowsをインストールし、D:ドライブ下でインストーラーを動かしたものの、TARGETDIRはE:\を指していた。これはもう何が何だか分かりません)

動かない(アーカイブファイルdata.7zが展開されない)原因はいくつか考えられて、

考えられる原因1つ目:
TARGETDIRの値が C:\ だとすると、カスタムアクション実行時の7z.exe のコマンドラインは以下のようになります。

7z.exe x -y -oC:\ [SourceDir]\data.7z"

この場合、C:\ 直下は管理者権限が無いと展開したファイルの保存ができないはずです。アクセス拒否ではねられます。

2つ目:
1つ目にも関係しますが、カスタムアクションの実行はタイミング(アクション)によって実行権限が変わります。これはWindowsインストーラーがユーザー権限で動作するmsiexec.exeと、Windowsサービスのインストーラープロセスとの協調動作でインストール作業をする為です。一般ユーザーではC:\Program Files等のディレクトリにファイルをコピーできないのと同様に、カスタムアクション実行時に一般ユーザーで動作させるような設定をすると、所望の動作ができません。

以下の「Execute」の部分をご覧ください。
WiX - CustomAction エレメント

デフォルトはimmediate「カスタムアクションが通常の処理時間の間にユーザー権限で動くことを示します。」なので、カスタムアクションの内容によってはコピー操作に失敗したりします。

3つ目:
7z.exe は展開の実行時に7z.dll等の他のファイルが必要になります。インストーラーに組み込んで、カスタムアクション実行時に同じディレクトリに展開しないと7z.exe自体の実行に失敗し、結果としてアーカイブファイルの展開ができません。ご提示のXMLでは7z.dllは含んでいないようなので、これも原因のひとつかもしれません。

確認方法ですが、Windowsインストーラーの実行時にログを出力することができます。これを利用するとTARGETDIRなどのプロパティやアクションの実行タイミングがログに出力されるので、問題解決の一助になります。
Microsoft - Windows インストーラのログの記録を有効にする
なお、msiexec.exe のコマンドラインオプションでも指定できます。

ご質問がカスタムアクションとTARGETDIRプロパティに関することなので上記のように回答しましたが、カスタムアクションを利用して 7z.exeでファイルを独自に展開すると、Windowsインストーラーの管理外となる為、それらのファイルはアンインストールされなくなります。これは、アンインストール用のカスタムアクションも実装しなければならないことを意味します。(困りますよね?)

そもそも7z.exeと別のアーカイブファイルを使わず、基本に戻ってファイルをすべて*.msiファイルに含んでしまうのがお勧めです。*.msiも圧縮したCAB形式にすることができます。7-Zipの圧縮効率にはかなわないでしょうが、そんなに大きく変わらないのではないでしょうか。

投稿2019/04/05 15:28

編集2019/04/05 15:35
dodox86

総合スコア9183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/04/05 23:17

ご丁寧な回答ありがとうございました。 まず、1つ目の回答について、 う~ん。私は.msi実行時にUACの確認画面が出るので、大丈夫かな?と思ったのですが、Wixの動作としては、7z.exeを.msiからフォルダーに解凍してから実行しているようなので、 恐らく、別のプロセスとして、動いているようです。 しかし、管理者権限がないよ!とコマンドプロンプトが一瞬で閉じるわけではなく、 解凍自体はされているようなのですが、インストール先を見ても、7z内のファイルがないんですよね... 不思議です... 2つ目について、deferredにしてみましたが、状況は変わりませんでした。 3つ目について、7z.dllはなくても大丈夫だと思います。一応確認しました。 ファイルはやはりアンインストールされませんでした。NSISでは、最後にフォルダーが丸ごと消されるので大丈夫だと思いましたが、Windows Installerではそうはいかないようですね。 7zを使わずに、インストールファイルを複数に分割して配布する方法にシフトしたいと思います。
dodox86

2019/04/06 02:46

> 私は.msi実行時にUACの確認画面が出るので、大丈夫かな?と思ったのですが、Wixの動作としては、7z.exeを.msiからフォルダーに解凍してから実行しているようなので、恐らく、別のプロセスとして、動いているようです。 UACが出るのはperMachine指定でProgram Files下にインストールする指定の為です。例えばperUserで、一般ユーザーでもインストールできる場所であればUACは出ません。 ユーザー権限と管理者権限で動く箇所がインストールプロセスにおいて色々変わります。(これが分かりづらい)また、カスタムアクションはEXEもDLLも、実際にWindows Installerから別のプロセスとして起動されます。 > NSISでは、最後にフォルダーが丸ごと消されるので大丈夫だと思いましたが、Windows Installerではそうはいかないようですね。 極端な話、C:\直下にインストール指定した場合に無条件にまるごと消されたらマズイので、Windows Installerはインストールしたもの(ファイル、ディレクトリ、レジストリなど)だけを対象にします。WiX Toolsetは分かると細かいところまで制御できていいのですが、要望どおりの動きにするまで一苦労です。私もインストーラーを作るたびに試行錯誤です。
退会済みユーザー

退会済みユーザー

2019/04/06 09:34

あの後、インストーラー先のディレクトリを{app}で簡単に設定できるInno Setupを使い、やってみましたが、こちらは、7z.exeを管理者権限で実行させることが非常に難しく、exe内のmanifestを書き換えても、 普通に実行すればUACの画面が出るのですが、Inno Setupから実行させた場合は出ませんでした。 インストーラー作成ソフトってどれも一長一短ですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問