тихая установка msiexec, когда пакет уже установлен - PullRequest
5 голосов
/ 03 июня 2009

У меня есть следующий проблемный сценарий:

Проблемный сценарий Описание Начало ---------------------------

Я использую msiexec для установки пакета в тихом режиме следующим образом:

msiexec /i c:\mypackage.msi /quiet

Теперь у меня установлен пакет. Допустим, я ввел команду выше:

msiexec /i c:\mypackage.msi /quiet

Проблемный сценарий Описание Конец ---------------------------

Теперь, поскольку пакет уже установлен, установка должна завершиться неудачно. Но у меня нет никаких признаков этого.

Я использую опцию журнала, чтобы запустить журнал:

msiexec /i c:\mypackage.msi /quiet /l* log.txt

Когда возникают ошибки, я вижу их в журнале, но в сценарии, показанном выше, журнал пуст. В системный журнал событий также ничего не записывается. Итак, мой вопрос: как я могу получить информацию о том, что установка (вторая) не прошла?

Примечания:

Я не хочу решать эту проблему, написав пакетный скрипт, который будет проверять, установлен ли пакет до вызова msiexec. Причина в том, что это противоречит нашим требованиям к развертыванию клиентов.

У меня есть данные пользовательских действий DLL, во второй раз, DLL не активируется, поэтому я не могу использовать DLL для того, чтобы записать куда-нибудь ошибку.

Ответы [ 3 ]

5 голосов
/ 03 августа 2011

Установка не завершится неудачно, если пакет уже установлен, он был «успешно перенастроен»

Чтобы проверить, установлен ли в системе пакет установщика Windows, лучше всего использовать 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 голос
/ 03 июня 2009

Это ваш пакет? Если это так, установите обязательное условие, которое проверяет, не существует ли еще какой-либо ключевой файл или запись в реестре.

Если это не ваш пакет, оберните его во что-нибудь (другой установщик или исполняемый файл), который сделает проверку.

0 голосов
/ 08 июня 2012

Я знаю, что это старая ветка, но Google подбирает это и в интересах других, попробуйте это

start /wait msiexec /i c:\mypackage.msi /quiet

Если ошибка, echo %errorlevel% будет отличным от нуля. При вызове выше программно используйте GetLastError()

...