Frage

Wenn meine Anwendung zu deinstallieren, würde Ich mag die Wix Setup konfigurieren, alle zu entfernen Dateien, die nach der ursprünglichen Installation wurden hinzugefügt. Es scheint, wie das Deinstallationsprogramm entfernt nur die Verzeichnisse und Dateien, die ursprünglich aus der MSI-Datei installiert wurden und es lässt alles andere, was später im Anwendungsordner hinzugefügt wurde. In anderen Worten, würde Ich mag das Verzeichnis löschen, wenn die Deinstallation. Wie kann ich das tun?

War es hilfreich?

Lösung

Mit

RemoveFile Elemente mit On = " uninstall “. Hier ein Beispiel:

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

Aktualisieren

  

Es hat nicht funktioniert 100%. Es entfernt die Dateien, jedoch keine der zusätzlichen Verzeichnisse -   die, die nach der Installation erstellt - wurden entfernt. Irgendwelche Gedanken auf, dass? - pribeiro

Leider Windows Installer unterstützt keine Verzeichnisse mit Unterverzeichnissen zu löschen. In diesem Fall müssen Sie benutzerdefinierte Aktion greifen. Oder, wenn Sie wissen, was Unterordner sind, erstellen Sie eine Reihe von RemoveFolder und RemoveFile Elemente.

Andere Tipps

Verwenden Sie RemoveFolderEx Element von Util Erweiterung in WiX.
Mit diesem Ansatz werden alle Unterverzeichnisse ebenfalls entfernt (als href="https://stackoverflow.com/a/196149/572834"> mit RemoveFile Elemente direkt RemoveFile und RemoveFolder Tabelle in der MSI-Datenbank.

Um dies zu tun, habe ich einfach eine benutzerdefinierte Aktion erstellt auf Deinstallation aufgerufen werden.

Der WiX-Code wird wie folgt aussehen:

<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>

Der Code für die OnBeforeUninstall Methode in InstallerCustomActions.DLL sieht wie folgt aus (in 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

Hier ist eine Variation auf @ tronda Vorschlag. Ich bin eine Datei „install.log“ lösche, die von einer anderen benutzerdefinierten Aktion, bei der Deinstallation erstellt werden:

<Product>
    <CustomAction Id="Cleanup_logfile" Directory="INSTALLFOLDER"
    ExeCommand="cmd /C &quot;del install.log&quot;"
    Execute="deferred" Return="ignore" HideTarget="no" Impersonate="no" />

    <InstallExecuteSequence>
      <Custom Action="Cleanup_logfile" Before="RemoveFiles" >
        REMOVE="ALL"
      </Custom>
    </InstallExecuteSequence>
</Product>

Soweit ich verstehe, ich nicht „RemoveFile“, weil diese Datei nach der Installation erstellt wird verwenden können, und ist nicht Teil einer Komponentengruppe.

Nicht ein WIX-Experte, aber könnte eine mögliche (einfacher?) Lösung für dieses Problem sein, die rmdir MS DOS-Befehl mit der / S und / Q Optionen laufen.

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

Und die benutzerdefinierte Aktion die Arbeit tun, ist einfach:

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

Dann werden Sie die InstallExecuteSequence wie dokumentiert vielen Stellen ändern müssen.

Update: Hat Probleme mit diesem Ansatz. machen Sie eine benutzerdefinierte Aufgabe stattdessen endete jedoch die Auffassung, immer noch diese eine tragfähige Lösung, aber ohne die Details an der Arbeit.

Dies wäre eine vollständigere Antwort für @Pavel Vorschlag, für mich funktioniert 100%:

<Fragment Id="FolderUninstall">
    <?define RegDir="SYSTEM\ControlSet001\services\[Manufacturer]:[ProductName]"?>
    <?define RegValueName="InstallDir"?>
    <Property Id="INSTALLFOLDER">
        <RegistrySearch Root="HKLM" Key="$(var.RegDir)" Type="raw" 
                  Id="APPLICATIONFOLDER_REGSEARCH" Name="$(var.RegValueName)" />
    </Property>

    <DirectoryRef Id='INSTALLFOLDER'>
        <Component Id="UninstallFolder" Guid="*">
            <CreateFolder Directory="INSTALLFOLDER"/>
            <util:RemoveFolderEx Property="INSTALLFOLDER" On="uninstall"/>
            <RemoveFolder Id="INSTALLFOLDER" On="uninstall"/>
            <RegistryValue Root="HKLM" Key="$(var.RegDir)" Name="$(var.RegValueName)" 
                    Type="string" Value="[INSTALLFOLDER]" KeyPath="yes"/>
        </Component>
    </DirectoryRef>
</Fragment>

Und unter Produkt Element:

<Feature Id="Uninstall">
    <ComponentRef Id="UninstallFolder" Primary="yes"/>
</Feature>

gesetzt Dieser Ansatz einen Registrierungswert mit dem gewünschten Pfad des Ordners auf Deinstallation gelöscht werden. Am Ende, die beide install und Registry-Ordner werden aus dem System entfernt. Beachten Sie, dass der Pfad in die Registrierung in anderen Bienenstock und an anderen Orten sein kann.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top