Установить 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 в зависимости от варианта перезагрузки. Пожалуйста, попробуйте изменить ваш скрипт так, чтобы он взамен выбрасывал коды.