如何根据需要安装和/或重新安装msiexec

时间:2011-04-27 05:23:32

标签: windows-installer

我有一个内部MSI放在网络驱动器上,我想写一个登录脚本,以便我们网络上的任何人都可以将MSI安装到他们的机器上,或者只要MSI是自动重新安装它就可以更新(经常发生)。

如果我使用msiexec.exe /i REINSTALL=ALL,如果该机器上尚未安装MSI,它将无效。如果我遗漏REINSTALL=ALL,那么它将进行全新安装,但不会更新/重新安装。

如果尚未安装软件包,我应该选择哪些参数使其进行全新安装,如果已安装软件包,我应该完全重新安装?

首先运行msiexec /i然后重新安装可能会有效,但我想尽可能避免这种情况。

编辑:需要/famus的原因是这些是开发人员机器,有人可能会手动更新注册表或注册一组不同的dll。该脚本的目的是即使MSI没有任何变化,开发人员也可以运行该脚本以轻松恢复到“官方”环境。

4 个答案:

答案 0 :(得分:3)

尝试怎么样:
msiexec /i <path to msi> ADDLOCAL=<top level feature name>

您可以通过在Orca.exe中打开包并查看功能表来获取顶级功能。

答案 1 :(得分:2)

我最后用一个首先运行msiexec / famus的批处理文件解决了它,如果退出代码是1605,它将运行msiexec / i。

答案 2 :(得分:1)

支持次要升级的常见做法是在包中创作REINSTALL=ALL,但在产品{{1}时添加type 51 (set property) custom action REINSTALL={}以清除属性}}。我不确定这正是你想要的,但它可能是一个开始。如果您没有创建此包,则可以使用转换添加属性和清除操作:NOT Installed

答案 3 :(得分:1)

我会使用主要升级而不是小幅升级。对于主要升级,命令行将始终相同 - 无需使用不同的命令行,具体取决于它是升级还是全新安装。

主要升级实际上是完全独立的设置,它们通过升级表中指定的逻辑链接,告诉Windows Installer应如何执行“升级”。升级根本不是升级,而是卸载现有产品并安装新产品。

升级表有一个学习曲线,有时会有点希腊语,但它在指定升级行为方面具有很大的灵活性。一些样本:

  • 您可以卸载旧产品并安装新产品
  • 您可以禁止在较新的产品之上安装旧产品
  • 您可以允许在运行较旧的安装时降级较新的安装(例如,确保您在登录脚本中获得的版本是目标系统上的版本)

主要升级涉及一些额外的挑战,可能会使事情变得混乱。特别是主要升级允许在卸载旧版本之前安装新版本!此方案需要无错设置,并且组件引用正确完成。但是,最常见的方法是完全卸载旧版本,然后再安装新版本。这种方法更宽容,即使设置中的组件引用已经搞砸了,通常也能正常工作。

就个人而言,除了对公开发布的软件进行微调之外,我从不使用小的升级。我发现这些升级非常容易出错,部署繁琐,调试和QA耗时,而且通常不必要的复杂性。我也使用它们,因为前一个软件包的卸载逻辑中的错误导致主要升级失败。换句话说,当我需要修复故障安装才能正确卸载之前。

相关问题