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

Windows installer 如何让msiexec根据需要安装和/或重新安装,windows-installer,Windows Installer,我在网络驱动器上安装了一个内部MSI,我想编写一个登录脚本,这样我们网络上的任何人都可以将MSI安装到他们的机器上,或者在MSI更新时自动重新安装它(这种情况经常发生) 如果我使用msiexec.exe/I REINSTALL=ALL,如果MSI尚未安装在该计算机上,它将不会执行任何操作。如果我省略了重新安装=ALL,那么它将执行新的安装,但不会执行更新/重新安装 如果软件包尚未安装,我应该选择哪些参数使其重新安装;如果软件包已经安装,我应该选择哪些参数使其重新安装 首先运行msiexec/i然

我在网络驱动器上安装了一个内部MSI,我想编写一个登录脚本,这样我们网络上的任何人都可以将MSI安装到他们的机器上,或者在MSI更新时自动重新安装它(这种情况经常发生)

如果我使用
msiexec.exe/I REINSTALL=ALL
,如果MSI尚未安装在该计算机上,它将不会执行任何操作。如果我省略了
重新安装=ALL
,那么它将执行新的安装,但不会执行更新/重新安装

如果软件包尚未安装,我应该选择哪些参数使其重新安装;如果软件包已经安装,我应该选择哪些参数使其重新安装

首先运行
msiexec/i
然后重新安装可能会起作用,但如果可能的话,我希望避免这种情况

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

试一试怎么样:
msiexec/i ADDLOCAL=


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

支持小规模升级的一种常见做法是在软件包中编写
重新安装=ALL
,然后添加
重新安装={}
以在产品未安装时清除属性。我不确定这正是你想要的,但这可能是一个开始。如果没有创建此软件包,可以通过转换添加属性和清除操作:
msiexec.exe/i[…]TRANSFORMS=“[…]\reinstall.mst”
我将使用主要升级而不是次要升级。对于主要升级,命令行将始终相同-无需根据升级还是新安装使用不同的命令行

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

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

  • 您可以卸载旧产品并安装新产品
  • 您可以禁止在新产品上安装旧产品
  • 您可以允许在运行较旧的安装时降级较新的安装(例如,确保登录脚本中的版本是目标系统上的版本)
主要升级还涉及一些额外的挑战,这可能会让事情变得混乱。特别是重大升级允许在卸载旧版本之前安装新版本!此场景要求正确完成组件引用的无错误设置。然而,最常见的方法是完全卸载旧版本,然后再安装新版本。这种方法更为宽容,即使设置中的组件引用出错,通常也能正常工作


就我个人而言,除了对公开发布的软件进行一些小的调整外,我从不使用小的升级。我发现这些升级极易出错、部署繁琐、调试和QA耗时,而且通常不必要的复杂性。我还可以在由于前一个软件包的卸载逻辑错误而导致主要升级失败的情况下使用它们。换句话说,当我需要热修复错误安装,然后才能正确卸载时。

我最终用一个批处理文件解决了这个问题,该批处理文件首先运行msiexec/famus,如果退出代码是1605,它将运行msiexec/I。

是的,我们也在使用主要升级作为内部“正式”使用。我刚刚在问题中添加了一个编辑,提到需要修复/famus才能将机器恢复到官方设置,因此即使MSI没有升级,也必须这样做。