Windows Installer在卸载时不删除所有文件

时间:2016-07-14 09:24:35

标签: wix windows-installer uninstall

我在这里看到了一些类似的问题,但是没有一个解决方案对我来说非常清楚或有效。

我有一个安装程序(使用WiX创建),可以安装某些文件和文件夹。但是,在运行已安装的应用程序时,会创建一些文件夹并将一些文件复制到其中。卸载时不会删除这些文件和文件夹。

编辑到目前为止显示代码:

此INSTALLDIR属性:

<Property Id="INSTALLDIR">
        <RegistrySearch Id='Registry' Type='raw' Root='HKLM' Key='Software\$(var.Manufacturer)\$(var.ProductName)' Name='Location' />
    </Property>

此组件应在注册表中设置安装位置:

<Component Id="Registry" Guid="*">
                    <RegistryKey Root="HKMU" Key="Software\$(var.Manufacturer)\$(var.ProductName)">
                        <RegistryValue  Name="Location" 
                                        Type="string" 
                                        Value="[INSTALLDIR]" 
                                        Action="write" 
                                        KeyPath="yes" />
                    </RegistryKey>
                    <util:RemoveFolderEx On="uninstall" Property="INSTALLDIR" />
                </Component>

这确实会在注册表中创建一个包含安装位置的记录,但是我不确定如何调整此代码以记录“公共”&#39;目录并删除它 - 我不知道util:RemoveFolderEx应该去哪里(在哪个组件内)

2 个答案:

答案 0 :(得分:1)

我见过的最清楚的教程是this one(除了确实有明显的错误)。

替换此块:

<!-- 
  RemoveFolderEx requires that we "remember" the path for uninstall.
  Read the path value and set the APPLICATIONFOLDER property with the value.
-->
<Property Id="APPLICATIONFOLDER">
  <RegistrySearch Key="SOFTWARE\$(var.Manufacturer)\$(var.SkuName)" Root="HKLM" Type="raw" Id="APPLICATIONFOLDER_REGSEARCH" Name="Path" />
</Property>

这一个:

<!-- 
  RemoveFolderEx requires that we "remember" the path for uninstall.
  Read the path value and set the FOLDERTOREMOVE property with the value.
-->
<Property Id="FOLDERTOREMOVE">
  <RegistrySearch Key="SOFTWARE\$(var.Manufacturer)\$(var.SkuName)" Root="HKLM" Type="raw" Id="APPLICATIONFOLDER_REGSEARCH" Name="Path" />
</Property>

和这个块:

<util:RemoveFolderEx On="uninstall" Property="APPLICATIONFOLDER" />

这一个:

<util:RemoveFolderEx On="uninstall" Property="FOLDERTOREMOVE" />

你应该有一个工作测试。

使用两个不同属性的原因是herehere(与其他地方一起)。

如果您可以从Windows安装程序将为您保留的安装期间设置的其他值(例如ARPINSTALLLOCATION)派生路径,那么您可以调整上述实现以获得所需而无需创建你自己的注册表项。

答案 1 :(得分:1)

以B. Murri的回答为基础:

示例:您的应用程序在'installdir / public'中安装新文件或文件夹。这些文件未被删除,因为安装程序未添加这些文件。

首先,您需要创建一个注册表值,该值将存储您的公共目录的安装位置。这是在用户更改安装目录的情况下。

<!-- Note that the RegistryValue Value is being set to the 'public' directory ID -->
<DirectoryRef Id='INSTALLDIR'>
        <Component Id="RemovePublicDir" Guid="your-guid-here">
            <RegistryKey Root="HKCU" Key="Software\$(var.Manufacturer)\$(var.ProductName)">
                <RegistryValue  Name="Location" 
                                Type="string" 
                                Value="[PUBLIC]" 
                                Action="write" 
                                KeyPath="yes" />
            </RegistryKey>
            <CreateFolder Directory="PUBLIC"/>
            <util:RemoveFolderEx Property="FINDPUBLICDIR" On="uninstall"/>
            <RemoveFolder Id="PUBLIC" On="uninstall"/>
        </Component>
    </DirectoryRef>

您现在需要添加一个属性,以便稍后搜索此注册表值。确保上面的Root值与下面的值匹配:

<Property Id="FINDPUBLICDIR">
    <RegistrySearch Id='Registry' Type='raw' Root='HKCU' Key='Software\$(var.Manufacturer)\$(var.ProductName)' Name='Location' />
</Property>

将您的制造商名称和产品名称添加到变量中,如下所示:

<?define Manufacturer = "My Company"?>
<?define ProductName = "Test Application"?>

现在请务必在功能标记中调用此组件:

<Feature Id="FeatureId">
    <ComponentRef Id="RemovePublicDir" />
</Feature>