Можно ли отключить msiexec help GUI?
Я автоматизирую автоматический поиск и установку указанных пакетов.msi с помощью скрипта powershell, но если команда вызывается с ошибками синтаксиса, msiexec будет бесконечно долго ждать нажатия кнопки OK на своем отображении справки, несмотря на наличие /quiet и / или /passive,
На данный момент я вызываю это с:
(start-process -FilePath "msiexec" -ArgumentList "/i <path_to_package> /quiet /passive" -PassThru -Wait).ExitCode
Есть ли способ отключить отображение справки msiexec?
4 ответа
К сожалению, я думаю, что единственный способ избежать отображения справки - это...
... не допускайте опечаток / синтаксических ошибок.
Хотел бы я иметь лучший ответ для вас, но...
Нет способа отключить это поведение для msiexec
Команда, содержащая синтаксическую ошибку. Вы можете заключить команду в нечто вроде следующего. Он использует.NET Automation для поиска окна "использования" и работы с ним в скрипте.
Add-Type -AssemblyName UIAutomationClient
Add-Type -AssemblyName UIAutomationTypes
# Note the invalid argument '/badswitch'
$mse = Start-Process -FilePath 'msiexec' -ArgumentList "/i package.msi /badswitch /quiet /passive" -PassThru
# Let msiexec at least get off the ground
[void] $mse.WaitForInputIdle()
# Create an AutomationElement from $mse's handle
$mseAuto = [Windows.Automation.AutomationElement]::FromHandle($mse.MainWindowHandle)
# A PropertyCondition for findAll()
$pane = New-Object Windows.Automation.PropertyCondition -ArgumentList (
[Windows.Automation.AutomationElement]::ControlTypeProperty,
[Windows.Automation.ControlType]::Pane
)
# Search for a child $pane element.
$findResult = $mseAuto.FindFirst(
[System.Windows.Automation.TreeScope]::Children,
$pane
)
# If there's a pane element in $mseAuto, and it contains "usage" string, it's an msiexec syntax issue, so close $mse's window.
if ( $findResult.Current.Name -match 'msiexec /Option <Required Parameter>' ) {
[void] $mse.CloseMainWindow()
} else {
# You should put something more sane here to handle waiting for "good" installs to complete.
$mse.WaitForExit()
}
$mse.ExitCode
Это тоже имеет проблемы. С /quiet
диалоговое окно прогресса все еще отображается во время установки. Вы можете рассмотреть возможность использования /qn
вместо того, чтобы скрыть все msiexec
Элементы пользовательского интерфейса. Также MSI может вызвать другие ошибки, необработанные, что приостановит неверность выполнения. Возможно, включить значение времени ожидания? А что за внешний процесс запущен из таблицы CustomAction? Извините, я близок к бессвязному делу...
Я бы просто не стал использовать msiexec.exe. Это возможно, используя API установщика Windows, используя сценарии или код.
Вы можете использовать автоматизацию COM с помощью VBScript / VBA / VB или с помощью DTF, который является оболочкой.NET для API установщика Windows, с которой легче работать из языков.NET, таких как C#.
Вы даже можете напрямую перейти через C++ к необработанным вызовам Win32 API, но это просто пустая трата времени, поскольку у вас есть как COM, так и.NET-эквиваленты, которые вызывают необработанный Win32 API как часть их работы.
Решение 1: VBScripts и COM Automation
Если использование автоматизации является опцией, вы должны иметь возможность пройти автоматизацию COM установщика Windows и автоматизировать установку / удаление таким образом. Вот VBScript, который вы можете поместить в файл и запустить (очевидно, обновите имя пути MSI):
Const msiUILevelEndDialog = 128
Set msi = CreateObject("WindowsInstaller.Installer")
msi.UILevel = msiUILevelEndDialog
msi.InstallProduct( "C:\msifile.msi")
Set msi = Nothing
Решение 2: DTF - Фонд средств развертывания -.NET
DTF (Deployment Tools Foundation) - это, по сути, оболочка.NET для API установщика Windows - он содержит такую мощную коллекцию сборок.NET для работы непосредственно с аспектами установщика Windows, поэтому я просто хочу добавить его сюда для справки для тех, кто искать решение с большим количеством детального контроля развертывания, чтобы решить их проблему администрирования. Очень простой код в приложении C# обеспечивает полный контроль над процессом установки. Вот грубый макет:
using Microsoft.Deployment.WindowsInstaller.Installer;
Installer.SetInternalUI(InstallUIOptions.Silent);
Installer.InstallProduct(msiFilename, "ACTION=INSTALL ALLUSERS=1");
Вы можете овладеть DTF с помощью инструментария WIX, который представляет собой общее решение для создания файлов MSI из исходных файлов XML. Вы найдете отличную документацию в DTF.chm и DTFAPI.chm, а фактические файлы находятся в основной папке установки. Последние два, как правило, вам нужны:
- Microsoft.Deployment.Compression.dll - платформа для упаковки и распаковки архивов.
- Microsoft.Deployment.Compression.Cab.dll - Осуществляет упаковку и распаковку архивов кабинета.
- Microsoft.Deployment.Resources.dll - классы для чтения и записи данных ресурсов в исполняемые файлы.
- Microsoft.Deployment.Windows Installer.dll - полная библиотека классов для API установщика Windows.
- Microsoft.Deployment.Windows Installer.Package.dll - Расширенные классы для работы с установщиком Windows и пакетами исправлений.
Просто создайте проект C#, ссылайтесь на эти файлы и кодируйте свое собственное приложение развертывания с любым управлением, которое вы пожелаете и в чем нуждаетесь. В настоящее время я не настроен на использование инструментов для DTF, но посмотрите на этот пример, чтобы получить общее представление о том, как будет работать программа на C#.
Решение 3: Функции установщика C++
Я просто подумал, что добавлю это - это в значительной степени не имеет значения для системных администраторов, я верю, но это может помочь лучше понять технологию MSI. Помимо автоматизации COM, есть также Win32 API с функциями, доступными из C++. Конечно, гораздо лучшая производительность (автоматизация COM, очевидно, вызывает эти функции Win32 под капотом - COM, конечно, является просто оберткой поверх этих "реальных" функций).
У меня сейчас нет доступных примеров C++ для этого, но вот документация SDK: Справочник установщика Windows. И прямая ссылка на список актуальных функций установщика. Этот список функций должен дать вам краткое представление о том, каково это использовать эту технологию.
ОБНОВЛЕНИЕ: я добавил пример фрагмента кода C++ в этот ответ на стекоперенос о различных способах удаления пакета MSI (раздел 14 в нижней части ответа).
Системные администраторы не будут использовать эту опцию, но коммерческие инструменты будут использовать для доступа к системной базе данных MSI (хранящейся в нескольких местах в реестре и с папкой кэша на диске - %SystemRoot%\Installer
- и несколько "рабочих папок"). Например, ваша SCCM или аналогичная система развертывания будут использовать их "под капотом".
Вы пробовали /qn ключ? он должен подавлять все запросы интерфейса пользователя.
http://technet.microsoft.com/en-us/library/cc759262(v=ws.10).aspx