自定义操作 - 仅在安装时卸载

Custom Action - Only uninstall if installed

我有一个 Windows 安装程序项目附加到我的解决方案,它允许用户使用 "Checkboxes" 对话框有选择地安装应用程序的两个组件(它们是 Windows 服务)我已添加到用户界面的框,然后是自定义操作的条件...

即在自定义操作/安装中我有

ProjectA 的主要输出(活动)
- 条件 = PROJECTACHOSEN(即 Checkbox1Property 值)

ProjectB 的主要输出(活动)
- 条件 = PROJECTBCHOSEN(即 Checkbox2Property 值)

在自定义操作/卸载中,我添加了相同的两个 "Primary Outputs"。

问题是,如果在安装过程中用户只选择了两个项目之一,那么卸载程序仍然会尝试卸载这两个服务,当然会在找不到丢失的服务时抛出错误,导致卸载失败。

我可以在“卸载”中添加什么条件以仅安装当前已安装的服务?

我试过:

到目前为止,我想出的最佳解决方案是:

  1. 为每个项目添加一个文件搜索"Launch Condition",检查作为服务的 .exe 文件是否存在,并给它一个 "Property" 值。

  2. 使用 属性 值作为自定义操作的 "Condition"。

这行得通,但我对此并不完全满意,因为删除服务比删除 exe 更重要,如果 exe 丢失,它将无法工作,服务将保留...

编辑

除非我将搜索 "Depth" 设置为至少 3(即使 exe 文件在安装目录中并且 "Folder" 设置为 [TARGETDIR]),否则即使这样也不起作用,但如果我这样做,安装程序需要大约 20 秒才能启动 - 大概是因为搜索 3 级子目录需要时间。但是,如果我设置的比那个小,尽管安装程序启动很快,它现在似乎找不到 exe 并且不会卸载服务...

[TARGETDIR] 不应该反映我的安装目录并因此使用深度 0 吗?

您可以使用 ?ComponentName 检查组件的安装状态,几个月前我也用过类似的方法。

我在 flexera here

的作弊 sheet 中找到了它