我有以下有问题的情况:
有问题的Scenrio说明开始---------------------------
我使用msiexec以安静模式安装软件包,方法如下:
msiexec /i c:\mypackage.msi /quiet
现在我安装了包。假设我再次进入上面的命令:
msiexec /i c:\mypackage.msi /quiet
有问题的Scenrio说明结束---------------------------
既然已经安装了软件包,安装就会失败。但我没有迹象表明。
我使用日志选项来获取日志:
msiexec /i c:\mypackage.msi /quiet /l* log.txt
发生错误时,我会在日志中看到它们,但在上面描述的场景中,日志为空。系统事件日志中也没有写入任何内容。所以我的问题是,我怎样才能得到安装(第二个)没有出现的指示?
注意:
我不愿意通过编写批处理脚本来解决此问题,该脚本将在调用msiexec之前检查是否已安装该程序包。原因是它与我们的客户部署要求相矛盾。
我有一个DLL自定义动作数据,在第二次,DLL没有被激活,所以我不能使用DLL来编写某个地方的失败。
答案 0 :(得分:5)
如果已安装软件包,安装不会失败,它已“成功重新配置”
为了检查系统上是否安装了Windows Installer程序包,您最好使用Windows SDK(而不是批处理文件) - 这是一个示例脚本,它迭代已安装产品的列表并触发MSIEXEC如果尚未安装。 (此示例按名称搜索,或者您可以按包代码搜索)
Option Explicit
Dim productName:productName = "My Awesome Product"
Dim installer : Set installer = Nothing
Set installer = Wscript.CreateObject("WindowsInstaller.Installer")
Dim productCode, property, value, message
For Each productCode In installer.Products
If InStr(1, LCase(installer.ProductInfo(productCode, "ProductName")), LCase(productName)) Then Exit For
Next
If IsEmpty(productCode) Then
Dim WshShell, oExec
Set WshShell = CreateObject("WScript.Shell")
WshShell.Exec("msiexec /i mypackage.msi /qb")
Else
Wscript.Echo productName & " is already installed."
Wscript.Quit 2
End If
答案 1 :(得分:1)
是你的包裹吗?如果是这样,请设置先决条件,检查某些密钥文件或注册表项是否尚不存在。
如果不是你的包裹,请将其包裹在进行检查的东西(另一个安装人员或exe)中。
答案 2 :(得分:0)
我知道这是旧线程,但是Google会点击这一点并且为了其他人的利益而尝试这个
start /wait msiexec /i c:\mypackage.msi /quiet
如果错误,echo %errorlevel%
将不为零。如果以编程方式在上面调用,请使用GetLastError()