89

アプリケーションをアンインストールするときに、元のインストール後に追加されたすべてのファイルを削除するようにWixセットアップを設定したいと思います。アンインストーラーは、MSI ファイルから最初にインストールされたディレクトリとファイルのみを削除し、後でアプリケーション フォルダーに追加されたものはすべて残したようです。つまり、アンインストール時にディレクトリをパージしたいのです。それ、どうやったら出来るの?

4

6 に答える 6

87

On=" uninstall " でRemoveFile 要素を使用します。次に例を示します。

<Directory Id="CommonAppDataFolder" Name="CommonAppDataFolder">
  <Directory Id="MyAppFolder" Name="My">
    <Component Id="MyAppFolder" Guid="*">
      <CreateFolder />
      <RemoveFile Id="PurgeAppFolder" Name="*.*" On="uninstall" />
    </Component>
  </Directory>
</Directory>

アップデート

100%うまくいきませんでした。ファイルは削除されましたが、インストール後に作成された追加のディレクトリは削除されませんでした。それについて何か考えはありますか?– プリベイロ

残念ながら、Windows インストーラーは、サブディレクトリを含むディレクトリの削除をサポートしていません。この場合、カスタム アクションに頼る必要があります。または、サブフォルダーが何であるかを知っている場合は、一連の RemoveFolder および RemoveFile 要素を作成します。

于 2008-10-12T21:38:42.043 に答える
32

RemoveFolderExWiX の Util 拡張の要素を使用します。
このアプローチでは、すべてのサブディレクトリも削除されます (要素を直接使用RemoveFileするのではなく)。この要素は、一時的な行をMSI データベースのテーブルにRemoveFile追加します。RemoveFolder

于 2012-05-07T06:20:33.780 に答える
13

これを行うには、アンインストール時に呼び出されるカスタム アクションを作成するだけです。

WiX コードは次のようになります。

<Binary Id="InstallUtil" src="InstallUtilLib.dll" />

<CustomAction Id="DIRCA_TARGETDIR" Return="check" Execute="firstSequence" Property="TARGETDIR" Value="[ProgramFilesFolder][Manufacturer]\[ProductName]" />
<CustomAction Id="Uninstall" BinaryKey="InstallUtil" DllEntry="ManagedInstall" Execute="deferred" />
<CustomAction Id="UninstallSetProp" Property="Uninstall" Value="/installtype=notransaction /action=uninstall /LogFile= /targetDir=&quot;[TARGETDIR]\Bin&quot; &quot;[#InstallerCustomActionsDLL]&quot; &quot;[#InstallerCustomActionsDLLCONFIG]&quot;" />

<Directory Id="BinFolder" Name="Bin" >
    <Component Id="InstallerCustomActions" Guid="*">
        <File Id="InstallerCustomActionsDLL" Name="SetupCA.dll" LongName="InstallerCustomActions.dll" src="InstallerCustomActions.dll" Vital="yes" KeyPath="yes" DiskId="1" Compressed="no" />
        <File Id="InstallerCustomActionsDLLCONFIG" Name="SetupCA.con" LongName="InstallerCustomActions.dll.Config" src="InstallerCustomActions.dll.Config" Vital="yes" DiskId="1" />
    </Component>
</Directory>

<Feature Id="Complete" Level="1" ConfigurableDirectory="TARGETDIR">
    <ComponentRef Id="InstallerCustomActions" />
</Feature>

<InstallExecuteSequence>
    <Custom Action="UninstallSetProp" After="MsiUnpublishAssemblies">$InstallerCustomActions=2</Custom>
    <Custom Action="Uninstall" After="UninstallSetProp">$InstallerCustomActions=2</Custom>
</InstallExecuteSequence>

InstallerCustomActions.DLL の OnBeforeUninstall メソッドのコードは、次のようになります (VB の場合)。

Protected Overrides Sub OnBeforeUninstall(ByVal savedState As System.Collections.IDictionary)
    MyBase.OnBeforeUninstall(savedState)

    Try
        Dim CommonAppData As String = Me.Context.Parameters("CommonAppData")
        If CommonAppData.StartsWith("\") And Not CommonAppData.StartsWith("\\") Then
            CommonAppData = "\" + CommonAppData
        End If
        Dim targetDir As String = Me.Context.Parameters("targetDir")
        If targetDir.StartsWith("\") And Not targetDir.StartsWith("\\") Then
            targetDir = "\" + targetDir
        End If

        DeleteFile("<filename.extension>", targetDir) 'delete from bin directory
        DeleteDirectory("*.*", "<DirectoryName>") 'delete any extra directories created by program
    Catch
    End Try
End Sub

Private Sub DeleteFile(ByVal searchPattern As String, ByVal deleteDir As String)
    Try
        For Each fileName As String In Directory.GetFiles(deleteDir, searchPattern)
            File.Delete(fileName)
        Next
    Catch
    End Try
End Sub

Private Sub DeleteDirectory(ByVal searchPattern As String, ByVal deleteDir As String)
    Try
        For Each dirName As String In Directory.GetDirectories(deleteDir, searchPattern)
            Directory.Delete(dirName)
        Next
    Catch
    End Try
End Sub
于 2008-11-06T21:39:41.177 に答える
6

WIX の専門家ではありませんが、WIXの組み込み拡張機能の一部であるQuiet Execution Custom Actionを実行することで、これに対する可能な (より簡単な?) 解決策はありますか?

/S および /Q オプションを 指定してrmdir MS DOS コマンドを実行できます。

<Binary Id="CommandPrompt" SourceFile="C:\Windows\System32\cmd.exe" />

そして、ジョブを実行するカスタム アクションは単純です。

<CustomAction Id="DeleteFolder" BinaryKey="CommandPrompt" 
              ExeCommand='/c rmdir /S /Q "[CommonAppDataFolder]MyAppFolder\PurgeAppFolder"' 
              Execute="immediate" Return="check" />

次に、多くの場所で文書化されているように、InstallExecuteSequence を変更する必要があります。

更新: このアプローチには問題がありました。代わりにカスタムタスクを作成することになりましたが、これは実行可能な解決策であると考えていますが、詳細を機能させることはできません。

于 2010-02-02T12:47:31.973 に答える