我已经回答了一个似乎有帮助的类似问题:
Windows 批处理文件不等待命令完成
通常,当您有一个包含两行的批处理文件时:
call msiexec /x {...} /qb
call msiexec /i "c:\myPath\myProduct.msi" /qb
它应该在安装开始之前等待卸载。
- “电话”很重要!
- 对于以前版本的卸载,您必须使用
/x {ProductCode to fill in}
而不是/x "filename"
. 在每种情况下,使用产品代码更安全。
- 为了确定会发生什么,您可以
pause
在两者之间和末尾添加一条线。
如果它似乎仍然不起作用,则必须循环直到产品真正卸载,等待两秒钟然后继续安装。
有几种可能性可以找出是否仍然安装了程序。
大多数人会推荐 VB 脚本作为最简单的解决方案,至少这些是最知名的。这是来自 saschabeaumont 的 VBS 片段,用于来自另一个问题的卸载调用:
MSI Install Fails because "Another version of this product is already installed"
它主要找出给定产品名称(部分)的产品代码,如果合适则开始卸载(注意部分匹配)。如果卸载已经完成(= 产品不再在已安装的产品列表中),您可以将它用于相同的事情并再次复制算法以异步询问。
当然,在其他脚本语言中也是可能的,即 JScript、Powershell 和传统编程语言。在纯批处理脚本中很难做到 - 例如,如果安装了产品,您可以测试HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall下的 ProductCode 注册表项。但只有一个缺点要提:如果批处理是从 32/64 位子系统启动和/或 MSI 是 32/64 位,则必须考虑差异。因此,我建议使用 VBS 而不是批处理(您可以从批处理中调用它cscript xxx.vbs
)。