アプリケーションをアンインストールするときに、元のインストール後に追加されたすべてのファイルを削除するようにWixセットアップを設定したいと思います。アンインストーラーは、MSI ファイルから最初にインストールされたディレクトリとファイルのみを削除し、後でアプリケーション フォルダーに追加されたものはすべて残したようです。つまり、アンインストール時にディレクトリをパージしたいのです。それ、どうやったら出来るの?
6 に答える
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 要素を作成します。
RemoveFolderEx
WiX の Util 拡張の要素を使用します。
このアプローチでは、すべてのサブディレクトリも削除されます (要素を直接使用RemoveFile
するのではなく)。この要素は、一時的な行をMSI データベースのテーブルにRemoveFile
追加します。RemoveFolder
これを行うには、アンインストール時に呼び出されるカスタム アクションを作成するだけです。
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="[TARGETDIR]\Bin" "[#InstallerCustomActionsDLL]" "[#InstallerCustomActionsDLLCONFIG]"" />
<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
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 を変更する必要があります。
更新: このアプローチには問題がありました。代わりにカスタムタスクを作成することになりましたが、これは実行可能な解決策であると考えていますが、詳細を機能させることはできません。