【问题标题】:Wix: condition on property not workingWix:属性不工作的条件
【发布时间】:2011-11-25 18:35:52
【问题描述】:

我有一个 util:RemoveFolderEx 元素,我只想在卸载程序时运行它。我把它放在它自己的组件中,然后在属性上设置一个条件来判断它是否应该被包含。

谁能向我解释为什么以下方法不起作用?

<Property Id='UNINSTALLMODE' Value="FALSE"></Property>

<DirectoryRef Id="DATADIR">        
    <Component Id="C.RemoveDataFolder" Guid="myguid" KeyPath="yes">
        <util:RemoveFolderEx On="uninstall" Property="DATADIR" ></util:RemoveFolderEx>
        <Condition>(UNINSTALLMODE="TRUE")</Condition>
    </Component>
</DirectoryRef>

<CustomAction Id="CA.SetUninstallMode" Property="UNINSTALLMODE" Value="TRUE" />

<InstallExecuteSequence>
    <Custom Action="CA.SetUninstallMode" Before="WixRemoveFoldersEx" >(NOT UPGRADINGPRODUCTCODE) AND (REMOVE="ALL")</Custom>
</InstallExecuteSequence>            

我检查了日志,并且在卸载软件时自定义操作正确地将 UNINSTALLMODE 设置为“TRUE”。在安装和重新安装时它是“FALSE”。我已尝试在与 RemoveFoldersEx 相关的 Before="WixRemoveFoldersEx" 和 Before="CostInitialise" 之前安排自定义操作。

非常感谢任何帮助,这让我发疯了!尼尔


编辑:我将 wix 更新为此

<Property Id='P.INSTALLMODE' Value='0'></Property>
<Property Id='P.UNINSTALLMODE' Value='0'></Property>

<DirectoryRef Id="DATADIR">        
    <Component Id="C.RemoveDataFolder" Guid="myguid" KeyPath="yes">
        <util:RemoveFolderEx On="uninstall" Property="DATADIR" ></util:RemoveFolderEx>
        <Condition>(P.INSTALLMODE = 1) OR (P.UNINSTALLMODE = 1)</Condition>
    </Component>
</DirectoryRef>

<CustomAction Id="CA.SetInstallModeToTrue" Property="P.INSTALLMODE" Value='1' />
<CustomAction Id="CA.SetUninstallModeToTrue" Property="P.UNINSTALLMODE" Value='1' />

<InstallExecuteSequence>
    <RemoveExistingProducts Before="InstallInitialize" />            

    <Custom Action="CA.SetInstallModeToTrue" Before="ValidateProductID" >(NOT UPGRADINGPRODUCTCODE) AND (NOT PREVIOUSVERSIONSINSTALLED)</Custom>
    <Custom Action="CA.SetUninstallModeToTrue" Before="ValidateProductID" >(NOT UPGRADINGPRODUCTCODE) AND (REMOVE="ALL")</Custom>
</InstallExecuteSequence>

自定义操作在从注册表中读取 DATADIR 值之后并在 CostInitialize 之前立即运行。

这是在以下情况下会发生的情况

  • 安装 -> 满足条件并安装组件
  • 重新安装 -> 条件不满足但组件仍被卸载然后重新安装
  • 卸载 -> 满足条件并卸载组件

我能从中得到的只是,该条件仅适用于安装过程,一旦安装了组件,就无法对其施加移除条件。


EDIT2:最后通过使用由自定义操作设置的 removefolderex 属性来实现此功能。现在看起来很简单。

<Property Id='P.REMOVEDATAFOLDER' Secure='yes' />

<DirectoryRef Id="DATADIR">        
    <Component Id="C.RemoveDataFolder" Guid="myguid" KeyPath="yes">
        <util:RemoveFolderEx On="uninstall" Property="P.REMOVEDATAFOLDER" />
    </Component>
</DirectoryRef>

<CustomAction Id="CA.SetDataFolder" Property="P.REMOVEDATAFOLDER" Value='[DATADIR]' />

<InstallExecuteSequence>           
    <Custom Action="CA.SetDataFolder" Before="ValidateProductID" >(NOT UPGRADINGPRODUCTCODE) AND (REMOVE="ALL")</Custom>
</InstallExecuteSequence>  

【问题讨论】:

    标签: wix windows-installer


    【解决方案1】:

    包含 RemoveFolderEx 元素的组件的条件在安装时为 False。这意味着该组件未安装。如果它没有安装,它显然也不会被卸载。因此,即使卸载时条件驱动属性为 True,CA 也不会运行,因为它所依赖的组件没有安装。

    【讨论】:

    • 那么解决方案是否会尝试使条件如下? install=true 重新安装=false 卸载=true
    • @Neil 好像是这样。我会将 upgrade=false 添加到列表中:您希望在升级到较新版本的应用程序时保留这些文件。
    • @AlexeyIvanov 不幸的是,这不起作用,我设法得到它,所以我有两个属性 INSTALLMODE 和 UNINSTALLMODE。运行升级时,它会卸载然后重新安装,这两个属性都是错误的,但它仍然运行 removefolderex 部分并删除了所有内容。我想我将不得不承认失败,只需使用自定义 dll 操作来删除我需要的所有文件和文件夹。
    • @Neil 详细的安装日志可以提供有关属性值和运行操作的详细信息,它可能会有所帮助。当然要删除所有内容,你可以在 DLL 甚至 JScript/VSScript 中使用 CA,但缺点是如果用户在卸载过程中单击取消,则无法将文件放回原处。
    • @AlexeyIvanov。谢谢,我一直在使用详细日志来查看属性是在处理 RemoveFolderEx 命令之前设置的。我已经用我最新的 wix 更新了这个问题,但似乎我正在尝试做的事情超出了预期设计的范围。
    猜你喜欢
    • 2010-10-25
    • 1970-01-01
    • 2014-07-12
    • 2011-05-13
    • 1970-01-01
    • 1970-01-01
    • 2011-11-29
    • 1970-01-01
    • 2014-01-13
    相关资源
    最近更新 更多