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

use*_*637 5 installer windows-installer

我有以下有问题的情况:

有问题的Scenrio描述开始---------------------------

我使用msiexec以安静模式安装软件包,方法如下:

msiexec /i c:\mypackage.msi /quiet
Run Code Online (Sandbox Code Playgroud)

现在我安装了包.假设我再次输入上面的命令:

msiexec /i c:\mypackage.msi /quiet
Run Code Online (Sandbox Code Playgroud)

有问题的Scenrio描述结束---------------------------

现在,由于已经安装了软件包,因此安装失败.但我没有迹象表明.

我使用日志选项来获取日志:

msiexec /i c:\mypackage.msi /quiet /l* log.txt
Run Code Online (Sandbox Code Playgroud)

发生错误时,我会在日志中看到它们,但在上面描述的场景中,日志为空.系统事件日志中也没有写入任何内容.所以我的问题是,我怎样才能得到安装(第二个)没有出现的迹象?

笔记:

我不愿意通过编写一个批处理脚本来解决这个问题,该脚本将在调用msiexec之前检查是否安装了包.原因是它与我们的客户部署要求相矛盾.

我有一个DLL自定义动作数据,在第二次,DLL没有激活所以我不能使用DLL,以便在某处写入失败.

sas*_*ont 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
Run Code Online (Sandbox Code Playgroud)


Dav*_*veE 1

是你的包裹吗?如果是这样,请添加一个先决条件来检查某些关键文件或注册表项是否尚不存在。

如果这不是您的软件包,请将其包装在可以进行检查的东西(另一个安装程序或 exe)中。