175

MSI インストーラー ( WiXで作成) を変更して、アンインストール時にディレクトリ全体を削除したいと考えています。

RemoveFileWiX のおよびオプションは理解していRemoveFolderますが、インストール後にコンテンツが作成されたフォルダー全体を再帰的に削除するほど堅牢ではありません。

WiX をアンインストールするときにファイルを削除するという同様のスタック オーバーフローの質問に気付きましたが、バッチ スクリプトを呼び出してフォルダーを削除するだけで、これをより簡単に実行できるかどうか疑問に思っていました。

WiX を使用するのはこれが初めてで、まだカスタム アクションのコツをつかんでいます。アンインストール時にバッチ スクリプトを実行するカスタム アクションの基本的な例は何ですか?

4

6 に答える 6

195

編集:おそらく、現在すぐ下の答えを見てください。


このトピックは長い間頭痛の種でした。私はついにそれを理解しました。オンラインにはいくつかの解決策がありますが、どれも実際には機能しません。そしてもちろん、ドキュメントはありません。したがって、以下のチャートには、使用が提案されているいくつかのプロパティと、さまざまなインストールシナリオでそれらが持つ値があります。

代替テキスト

したがって、私の場合は、アンインストールでのみ実行されるCAが必要でした。アップグレードではなく、修復や変更ではありません。上記の表によると、私は使用しなければなりませんでした

<Custom Action='CA_ID' Before='other_CA_ID'>
        (NOT UPGRADINGPRODUCTCODE) AND (REMOVE="ALL")</Custom>

そしてそれはうまくいきました!

于 2009-04-08T20:34:43.577 に答える
51

カスタムアクションでこれを行うことができます。以下のカスタム アクションに参照を追加できます<InstallExecuteSequence>

<InstallExecuteSequence>
...
  <Custom Action="FileCleaner" After='InstallFinalize'>
          Installed AND NOT UPGRADINGPRODUCTCODE</Custom>

次に、以下でアクションを定義する必要もあります<Product>

<Product> 
...
  <CustomAction Id='FileCleaner' BinaryKey='FileCleanerEXE' 
                ExeCommand='' Return='asyncNoWait'  />

FileCleanerEXE はバイナリ (私の場合は、カスタム アクションを実行する小さな C++ プログラム) であり、以下でも定義されてい<Product>ます。

<Product> 
...
  <Binary Id="FileCleanerEXE" SourceFile="path\to\fileCleaner.exe" />

これに対する本当の秘訣はInstalled AND NOT UPGRADINGPRODUCTCODE、カスタム アクションの条件です。アクションはアップグレードごとに実行されます (アップグレードは実際にはアンインストールしてから再インストールするため)。ファイルを削除している場合、アップグレード中にはおそらく望ましくありません。

余談ですが、バッチスクリプトの代わりにC++プログラムのようなものを使用してアクションを実行することをお勧めします。これは、バッチスクリプトが提供するパワーと制御のためです-そして、「cmdプロンプト」ウィンドウが点滅するのを防ぐことができますインストーラーが実行されます。

于 2008-11-26T18:44:32.170 に答える
42

バッチスクリプトの最大の問題は、ユーザーが[キャンセル]をクリックしたとき(またはインストール中に問題が発生したとき)のロールバックを処理することです。このシナリオを処理する正しい方法は、RemoveFilesテーブルに一時的な行を追加するCustomActionを作成することです。このようにして、Windowsインストーラーがロールバックケースを処理します。あなたが解決策を見るとき、それはめちゃくちゃ簡単です。

とにかく、アンインストール中にのみアクションを実行するには、次の条件要素を追加します。

REMOVE ~= "ALL"

〜=は、大文字と小文字を区別しないことを示します(ALLは常に大文字と小文字が区別されると思いますが)。詳細については、条件構文に関するMSISDKのドキュメントを参照してください。

PS:私が座って、「ああ、バッチファイルはインストールパッケージの良い解決策になるだろう」と思ったというケースは一度もありません。実際、バッチファイルが含まれているインストールパッケージを見つけると、返金のために製品を返品するように促されるだけです。

于 2008-11-26T19:29:19.863 に答える