2011-04-27 148 views
3

我有一个内置的MSI放置在网络驱动器上,我想写一个登录脚本,以便我们网络上的任何人都可以将MSI安装到他们的机器上,或者在MSI更新时(通常会发生这种情况)让它自动重新安装。如何让msiexec根据需要安装和/或重新安装

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

如果软件包还没有安装,我应该选择什么参数进行全新安装,并且如果软件包已经安装,应该完全重新安装吗?

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

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

回答

2

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

3

关于尝试什么:
msiexec /i <path to msi> ADDLOCAL=<top level feature name>

您可以通过在Orca.exe的打开包装来看,在功能表中获取顶级功能(S)。

1

一种常见的做法在一个点上,以支持次要升级是笔者在包REINSTALL=ALL,但然后添加一个type 51 (set property) custom actionREINSTALL={}清除属性时,你的产品是NOT Installed。我不确定这正是你想要的,但它可能是一个开始。如果你没有创建这个包,你可以添加一个转换属性和清除动作:msiexec.exe /i [...] TRANSFORMS="[...]\reinstall.mst"

1

我会使用重大升级而不是次要升级。对于主要升级,命令行将始终保持不变 - 无需使用不同的命令行,具体取决于是升级还是全新安装。

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

升级表有一条学习曲线,有时候会有些希腊语,但它在指定升级行为时有很大的灵活性。部分样本:

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

主要升级还有一些额外的挑战会使事情混淆。特别是主要升级允许新版本的安装先于旧版本的卸载!这种情况下需要正确完成组件引用的无错设置。然而,最常见的方法是彻底卸载旧版本,然后安装新版本。这种方法更宽容,即使设置中的组件引用已被搞乱,该方法通常也能正常工作。

就我个人而言,我从来没有使用小的升级任何东西,只是对公开发布的软件进行微小的调整。我发现这些升级极易出错,部署繁琐,耗时调试和质量保证以及通常不必要的复杂性。如果主要升级因先前软件包的卸载逻辑错误而失败,我也会使用它们。换句话说,当我需要在可以正确卸载之前先修复有问题的安装。

+0

是的,我们正在使用主要升级作为其内部“官方”使用的一种。我只是在问题中添加了一个编辑,提及需要修复/系统才能将机器恢复到正式设置,因此即使没有升级到MSI也必须运行。 – Ying 2011-04-28 01:05:59