Установить MSI из скрипта, определить, когда установка завершена

Я пытаюсь сделать скрипт установки. Я хочу установить MSI-файл Python, а затем установить другие компоненты после установки Python. Я уже вижу, как выполнить установку из командной строки. Тем не мение, msiexec возвращается сразу, даже если установка все еще запущена. Как мне определить завершение установки MSI из пакетного скрипта?

4 ответа

Решение

Не знаю, как Python обрабатывает передачу команд в Windows/DOS, но использует простой командный файл и start /wait Команда командный файл останавливается и ждет, пока MSI не будет сделан, прежде чем перейти к следующему шагу.

Например, чтобы установить основное приложение, за которым следует патч только после его завершения, а затем финальная программа после завершения, поместите эти строки в файл.cmd:

start /wait msiexec /i O12Conv.msi /qb
start /wait msiexec /p O12Convsp1-en-us.msp /qb
start /wait msiexec /i mpsetupedp.msi

Это сложно и ненадежно, но есть способы отслеживать существование определенного процесса в списке процессов. Вы записываете свой цикл в NOOP, ожидая, когда этот процесс перестанет существовать, и затем вы делаете следующие шаги. Есть несколько способов справиться с этим.

Инструмент SysInternals pslist покажет процессы, хотя парсинг вывода может быть сложным. PowerShell может получить доступ к API.NET для мониторинга процессов через get-process Командлет.

Эти методы просто отслеживают существование процесса, они не могут проверять коды выхода и, следовательно, не могут знать, завершился ли процесс нормально или в состоянии ошибки. Для этого вам нужно будет обработать любые журналы MSI, которые вы указали, чтобы их сгенерировать, или, возможно, покопаться в журнале событий Windows даже на наличие ошибок.

В PowerShell либо перенаправьте куда-нибудь результат прямого вызова:

      msiexec /i my.msi /qn | Out-Null

Или используйтеStart-Processс-Waitпараметр:

      Start-Process msiexec -ArgumentList "/i my.msi /qn" -Wait

При успешной установке будет возвращен любой из 3 кодов: 0,1641,3010 в зависимости от варианта перезагрузки. Пожалуйста, попробуйте изменить ваш скрипт так, чтобы он взамен выбрасывал коды.

Другие вопросы по тегам