Installation 我怎样才能抑制“我怎么能抑制”呢;此操作仅对当前安装的产品有效;对不存在的项目运行msiexec/x时?

Installation 我怎样才能抑制“我怎么能抑制”呢;此操作仅对当前安装的产品有效;对不存在的项目运行msiexec/x时?,installation,windows-installer,wix3,wix3.11,Installation,Windows Installer,Wix3,Wix3.11,在安装新版本之前,我试图确保某些软件不存在。长话短说,虽然他们建议我在安装后进行修复,但这会导致其他问题,例如不希望重新启动(相信我,我尝试过/norestart,我甚至必须确保它不会重新启动),但总的来说,它只会让我们非常头痛,而没有我们想要的结果 所以我试着在安装新的软件之前卸载这个软件,因为它似乎有更高的成功率,没有不必要的问题 现在我通过exepack(使用WiX工具集)和Vital=“no”运行批处理文件来实现这一点。我必须执行Vital=“否”,因为当旧的安装程序不存在时,如果我调用

在安装新版本之前,我试图确保某些软件不存在。长话短说,虽然他们建议我在安装后进行修复,但这会导致其他问题,例如不希望重新启动(相信我,我尝试过/norestart,我甚至必须确保它不会重新启动),但总的来说,它只会让我们非常头痛,而没有我们想要的结果

所以我试着在安装新的软件之前卸载这个软件,因为它似乎有更高的成功率,没有不必要的问题

现在我通过exepack(使用WiX工具集)和Vital=“no”运行批处理文件来实现这一点。我必须执行Vital=“否”,因为当旧的安装程序不存在时,如果我调用
msiexec/x
,它将返回错误声明

此操作仅对当前安装的产品有效

当旧的安装存在时,它可以正常工作,但当它不存在时,它会出错

现在Vital=“no”可以正常工作,但如果可以,我更愿意使用
msiexec/x
来抑制错误


有什么已知的方法可以解决这个问题吗?

为了解决这个问题,我检查了卸载键,只对列出的产品调用了
msiexec/x
。虽然在我自己的情况下,我们正在切换安装程序技术(太多MSI错误…),并正在卸载我们自己的旧版本。

安装状态:如果知道产品GUID,可以使用VBScript检查产品的安装状态(在此处替换示例GUID):

有许多可能的安装状态。要检查产品安装状态


主要升级:我想您知道主要升级是如何工作的吧?(卸载现有安装和安装较新版本,并提供选项,说明安装顺序)。实际上,他们可以在安装时通过升级表中的设置卸载任何其他MSI软件包。这甚至包括有竞争力的产品(必须说有点疯狂)。但是,在很多情况下,您无法从MSI中轻松地再次安装它们。您可以通过Burn setup.exe引导程序(我想您使用的)安装它们。

您是如何检查该项目的存在的?通过查看注册表,如Computer\HKEY\u LOCAL\u MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\?@ShinT-Yup,就是在那里。请参阅下面我的答案。直到现在我才看到这个问题。希望这不会让人感到困惑,也不会有什么帮助。嗨,斯坦,不幸的是,主要升级不是一个选项。只需进行主要升级(本例中从SP19升级到SP26),从他们的wiki中引用“如果最终用户使用SP25或以前版本的就地升级,升级后,他们必须在控制面板/程序中修复安装。否则ADO.Net数据库连接将无法工作。”这要求我们在运行时进行修复,但这给了我们太多的支持电话,所以我决定卸载它们。这是Crystal Reports?有时你可以在主要升级的时候尽早卸载它们,以便更好地清理和重新安装,但也有例外(例如降级文件和其他怪癖)。是的,卸载然后升级效果更好。只需知道所有单个版本的guid。但是,他们不分发较旧版本的安装程序,所以我只能支持SP10和SP19,但至少这是好的。检查他们是否共享相同的升级代码?然后您可以将它们标识为“相关产品”,并逐个卸载它们?请参阅以下答案:,(您可以调用
installer.RelatedProducts
,它将生成相关产品代码的列表)。这是一个不错的选择。但是,如果用户有未来版本,它不提供卸载未来版本的功能吗?由于未来版本的产品GUID还不存在(但假设升级GUID相同),我可能希望避免这种情况。由于产品代码未知,我无法参考注册表中的版本号。
Dim installer : Set installer = CreateObject("WindowsInstaller.Installer")
MsgBox installer.ProductState("{6C961B30-A670-8A05-3BFE-3947E84DD4E4}")