已安装软件包时msiexec安静安装

时间:2009-06-03 15:32:18

标签: installer windows-installer

我有以下有问题的情况:

有问题的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来编写某个地方的失败。

3 个答案:

答案 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()