如何静默卸载捆绑在 wix 包中的 InstallShield.exe?

How to silently uninstall InstallShield.exe which is bundled inside a wix bundle?

我正在使用 wix 开发自定义托管引导程序应用程序。我的安装程序安装 .Netframework461(如果需要)、redist_x86 和我的应用程序的 msipackage。

我的新要求是连同上述组件我需要安装一个 InstallShied exe。我可以静默安装 installshield exe,但我的安装程序没有卸载 installshield。

我在wix包文件中添加的代码如下:

<PackageGroup Id ="InstallShield">
  <ExePackage Id="InstallShield" DisplayName="InstallShield" InstallCommand="/s /v/qn" UninstallCommand="/x /s /v/qn" PerMachine="yes" Vital="yes" Permanent="no" SourceFile="setup.exe" Compressed="yes"/>
</PackageGroup>

另一个有趣的部分是,我可以在命令提示符下使用代码中使用的相同命令静默安装和卸载相同的 InstallShield exe。

我的安装程序和命令提示符都处于 运行 管理员模式。

另外,在静默安装后,我通过更多研究了解到它会删除 exe 详细信息,因此它不会获得用于卸载的 installshield exe。我不知道这是正确的观察还是错误的。我的日志文件中显示的错误如下所示。

我得到了一个解决方案,比如为安装生成一个响应文件。我找到的命令如下。

Setup.exe /s /f1"[SETUPSUPPORTDIR]\Setup.iss"

但我的问题是如何静默卸载上述响应文件。正确的卸载命令是什么?

将 'Permanent="Yes"' 更改为 'Permanent="no"'。目前您的安装程序甚至不会尝试在卸载时删除 .exe 包,因为它被列为永久包。

您的 ExePackage 上没有 DetectCondition,因此引导程序无法在安装或卸载时确定是否安装了可执行文件。

A condition that determines if the package is present on the target system. This condition can use built-in variables and variables returned by searches. This condition is necessary because Windows doesn't provide a method to detect the presence of an ExePackage. Burn uses this condition to determine how to treat this package during a bundle action; for example, if this condition is false or omitted and the bundle is being installed, Burn will install this package.

通常,您通过让 RegistrySearch 查找安装产品时存在的特定注册表项或位置来检测条件,并且您可以将变量设置为它的值或 true 或 false 来判断它是否存在。然后你的检测条件可以很容易地根据变量的值进行评估,你的引导程序将知道尝试卸载或安装产品。

我不确定,但您可能需要为 Installshield setup.exe 卸载过程创建一个响应文件(这将是一个与安装期间创建的响应文件不同的响应文件)。看到这个答案:Installshield Silent Uninstall not working at Command Line

setup.exe 开关:

并把它作为一个很好的衡量标准:http://unattended.sourceforge.net/installers.php