我有一个内部MSI放在网络驱动器上,我想写一个登录脚本,以便我们网络上的任何人都可以将MSI安装到他们的机器上,或者只要MSI是自动重新安装它就可以更新(经常发生)。
如果我使用msiexec.exe /i REINSTALL=ALL
,如果该机器上尚未安装MSI,它将无效。如果我遗漏REINSTALL=ALL
,那么它将进行全新安装,但不会更新/重新安装。
如果尚未安装软件包,我应该选择哪些参数使其进行全新安装,如果已安装软件包,我应该完全重新安装?
首先运行msiexec /i
然后重新安装可能会有效,但我想尽可能避免这种情况。
编辑:需要/famus
的原因是这些是开发人员机器,有人可能会手动更新注册表或注册一组不同的dll。该脚本的目的是即使MSI没有任何变化,开发人员也可以运行该脚本以轻松恢复到“官方”环境。
答案 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耗时,而且通常不必要的复杂性。我也使用它们,因为前一个软件包的卸载逻辑中的错误导致主要升级失败。换句话说,当我需要修复故障安装才能正确卸载之前。