Как удалить более старую версию программного обеспечения перед установкой более новой версии с помощью NSIS - PullRequest
0 голосов
/ 06 ноября 2018

Я создаю новый установщик программного обеспечения, используя NSIS. Перед использованием NSIS мы использовали установщик WIX для создания того же пакета установщика.

Мое требование: когда мы устанавливаем более новую версию Установщика (например, EMR 4.0) с использованием NSIS, если есть какая-либо более старая версия установщика (например, EMR 3.0), которая была создана с помощью установщика WIX и присутствует, тогда мы должны удалите старую программу установки перед установкой новой версии программы установки.

Для этого я написал приведенный ниже фрагмент кода в .Oninit, но он не работает

ReadRegStr $R0 HKLM "SOFTWARE\CPS\PowerChute Personal Edition\3.01.00" "InstallPath"

В приведенной выше строке первый параметр, который я передал, взят из реестра Windows.

Второй параметр «InstallPath» - это местоположение каталога InstallPath: C: \ Program Files \ CPS \ PowerChute Personal Edition \

Pop $0;
${If} $0 <> 0
MessageBox MB_ICONSTOP "Reading Registry Failed, error $0"
${Else}
MessageBox MB_OKCANCEL "Reading the Registry $R0"

Здесь происходит переход к другой части и вывод сообщения: «Чтение реестра C: \ Program Files \ CPS \ PowerChute Personal Edition \»

Затем я добавил приведенный ниже код, но он показывает ошибку в IDOK: «Недопустимая команда:« IDOK »

IDOK uninst
    Abort
    ${EndIf}
    uninst:
    Exec $R0\uninst.exe
    done:

Я хотел знать, это правильный способ удаления? строка "Exec $ R0 \ uninst.exe" действительно работает?

А также можем ли мы использовать $ {If} $ R0 <> "", чтобы проверить, что путь не пустой?

Пожалуйста, помогите мне продолжить, высказав свои мысли.

Ниже приведен обновленный код:

ReadRegStr $R0 HKLM "SOFTWARE\CPS\PowerChute Personal Edition\3.01.00" "InstallPath"

${If} $R0 != ""
MessageBox MB_OKCANCEL "Powerchute is already installed. Remove the pervious version"
ExecWait '"$R0\uninst.exe"'
${Else}
MessageBox MB_OKCANCEL "Powerchute is not installed"

${EndIf}

Могу ли я использовать ExecWait «$ R0 \ uninst.exe» непосредственно под блоком сообщений в условии If.

Обновлен код для нового требования:

Мое новое требование в приведенной ниже функции .onInit, если условие IF выполнено, а не показывает MessageBox. Мне нужно показать диалоговое окно, в котором у меня есть заголовок, такой как «Изменить, восстановить или удалить установку», кнопку «Удалить» и некоторый текст. И когда я нажимаю на кнопку «Удалить», он должен удалить. Я написал некоторый код, но, пожалуйста, помогите мне закончить его.

Page custom MyPageCreate

Function .onInit

ReadRegStr $R0 HKLM "SOFTWARE\APC\PowerChute Personal Edition\3.01.00" "InstallPath"

${If} $R0 != ""
;MessageBox MB_OKCANCEL "Powerchute is already installed in $R0 Remove the ;pervious version?" IDOK uninst

; HERE I SHOULD CALL THE FUNCTION
MyPageCreate

Abort
uninst:

ExecWait '"MsiExec.exe" /X{8ED262EE-FC73-47A9-BB86-D92223246881}'

${Else}
MessageBox MB_OKCANCEL "Not intalled"

${EndIf}

FunctionEnd

Var Text

Below is the function:

Function MyPageCreate
nsDialogs::Create 1018
Pop $0

${NSD_CreateLabel} 0 0 100% 12u "Change, repair, or remove installation"
Pop $0


${NSD_CreateText} 0 13u 100% -13u "Type something here..."
    Pop $Text

**** Here I need to give the remove button **********

nsDialogs::Show
FunctionEnd

1 Ответ

0 голосов
/ 06 ноября 2018

ReadRegStr не добавляет в стек, Pop $0 не имеет смысла. Вы должны проверить документацию, если хотите знать, как определить, не выполнена ли инструкция. ReadRegStr устанавливает флаг ошибки и возвращает "" (пустая строка) в случае сбоя.

IDOK - это не инструкция, а ключевое слово, используемое с MessageBox. Вы, вероятно, ошиблись, когда скопировали код откуда-то.

Exec $R0\uninst.exe может работать, зависит от того, как написан этот деинсталлятор, нет общего ответа. Однако я бы посоветовал вам использовать ExecWait '"$R0\uninst.exe"'.

Вы не можете использовать <> "", чтобы проверить, является ли строка пустой, поскольку <> для чисел, используйте ${If} $R0 != "". LogicLib.nsh содержит список доступных операторов.

ReadRegStr $R0 HKLM "SOFTWARE\CPS\PowerChute Personal Edition\3.01.00" "InstallPath"
${If} $R0 != ""
  MessageBox MB_OKCANCEL "Powerchute is already installed. Remove the pervious version?" IDOK uninst
  Abort
uninst:
  ExecWait '"$R0\uninst.exe"'
${Else}
  MessageBox MB_OK "Powerchute is not installed"
${EndIf}
...