NSIS - msiexec / i завершается с кодом 1619, если я вызываю SetOutPath - PullRequest
2 голосов
/ 03 апреля 2012

ExecWait "msiexec /i myinstaller.msi /qn" $0

Это все, что я называю в моем сценарии. (/qn предназначен для установки без вывода сообщений без появления окна прогресса, я также тестировал без него).

Ошибка с кодом ошибки msiexec из 1619- This installation package could not be opened. Verify that the package exists and that you can access it, or contact the application vendor to verify that this is a valid Windows Installer package.

Тот же самый вызов msiexec прекрасно работает в командной строке, или если я пишу базовый сценарий NSIS, который больше ничего не делает - это означает, что он не из-за NTFS-разрешений , что поиск Google подбрасывает.

Следовательно, это должно быть что-то еще в моем основном скрипте установщика. После комментирования почти всего в моем сценарии, чтобы изолировать причину:

SetOutPath "$INSTDIR\Some directory"

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

Обновление - Вот версия проблемы tl;dr - следующий фрагмент не работает при запуске в качестве независимого сценария, если я не закомментирую вызов SetOutPath. ЗАЧЕМ? Не имеет значения, есть ли в выходном каталоге какие-либо файлы (нет) или я вызываю его непосредственно перед или несколькими строками раньше.

showinstdetails show
 OutFile test.exe
section
 setoutpath "D:\back"
 ExecWait "msiexec /i MyInstaller.msi /qr" $0
 MessageBox MB_OK $0
sectionend

Ответы [ 4 ]

2 голосов
/ 03 апреля 2012

Здесь могут быть две вещи не так. MSI действительно должен быть в кавычках, и вы должны указать полный путь к MSI. Первое важно, если вы включаете путь с пробелами в; второе важно, так как msiexec.exe должен знать, где находится msi - он может не находиться в системном пути.

Примерно так должно работать (если установщик находится в папке% TEMP%):

ExecWait 'msiexec /i "$TEMP\myinstaller.msi" /qn'
1 голос
/ 03 апреля 2012

SetOutPath устанавливает текущий / рабочий каталог для процесса.(Поэтому его использование повлияет на любые относительные пути позже в скрипте)

Вы всегда должны использовать полные пути, когда это возможно, и с правильными кавычками:

ExecWait 'msiexec /i "$exedir\myinstaller.msi" /qn' $0 (Замените $ exedir на правильный путьпри необходимости)

0 голосов
/ 04 апреля 2012

Выяснил, что не так, с частичной помощью от Ника и Андерса выше.В моем другом скрипте, который работал, я звонил SetOutPath после , вызывая MSI.

Изменение последовательности сработало.

Итак, урок извлечен - путаются относительные путипосле вызова SetOutPath, поэтому в моем исходном примере путь к msi будет сопоставлен с тем, который был установлен в 'SetOutPath, вместо использования текущего каталога, в котором находится установщик.

Спасибо, ребята!

0 голосов
/ 03 апреля 2012

Попробуйте использовать каталог $PLUGINSDIR и поместите туда myinstaller.msi.Это временная папка, которая будет автоматически удалена после выхода из программы установки.

InitPluginsDir 
File /oname=$PLUGINSDIR\myinstaller.msi "myinstaller.msi"

Затем в ExecWait.

следует использовать полный путь к myinstaller.msi.
...