接觸到NSIS制作安裝包,檢測并卸載已有版本,項目要把已有項目刪除,百度了方法,遇到了不少坑,慢慢的,現在的版本應該可以使用了。希望可以幫到一些人。
廢物不多說,先看下原本百度的代碼:
Var UNINSTALL_PROGVar OLD_VERVar OLD_PATHFunction .onInit ClearErrors ReadRegStr $UNINSTALL_PROG ${PRODUCT_UNINST_ROOT_KEY} ${PRODUCT_UNINST_KEY} "UninstallString" IfErrors done ReadRegStr $OLD_VER ${PRODUCT_UNINST_ROOT_KEY} ${PRODUCT_UNINST_KEY} "DisplayVersion" MessageBox MB_YESNOCANCEL|MB_ICONQUESTION / "檢測到本機已經安裝了 ${PRODUCT_NAME} $OLD_VER。/ $/n$/n是否先卸載已安裝的版本?" / /SD IDYES / IDYES uninstall / IDNO done Abortuninstall: StrCpy $OLD_PATH $UNINSTALL_PROG -10 ExecWait '"$UNINSTALL_PROG" /S _?=$OLD_PATH' $0 DetailPrint "uninst.exe returned $0" Delete "$UNINSTALL_PROG" RMDir $OLD_PATHdone:FunctionEnd分析下以上代碼:
聲明幾個變量,在安裝初始化回調方法中,清除錯誤標記,讀取注冊表
ReadRegStr 用戶變量(輸出) 根鍵 子鍵 項
上文讀取卸載路徑字符串并輸出到用戶變量$UNINSTALL_PROG,彈出MessageBox執行各操作,我看看下IDYES,執行卸載方法
uninstall: StrCpy $OLD_PATH $UNINSTALL_PROG -10 ExecWait '"$UNINSTALL_PROG" /S _?=$OLD_PATH' $0 DetailPrint "uninst.exe returned $0" Delete "$UNINSTALL_PROG" RMDir $OLD_PATH我們拿到的變量UNINSTALLPROG是帶有uninst.exe的,-10 拿到所謂的安裝路徑,輸出到變量$OLDPATH,然后執行ExecWait 執行uninst.exe
/S(區分大小寫)表示靜默卸載,
_?= 指定 $INSTDIR 這也會阻止卸載程序把它自己復制到臨時文件夾再運行。這將可以使用 ExecWait 來運行卸載程序并等待它完成。這個參數必須是最后一個參數并且不能帶任何引號即使路徑帶有空格。把&0作為返回代碼
這地方或許會遇到一個問題,但我們執行uninst.exe的時候,我們是執行的卸載,我們執行卸載肯定會調用un.onInit un.onUninstSuccess回調函數,以及卸載過程中的用戶函數,我當時就遇到MessageBox彈出的問題,嚴重影響使用,這個時候我們可以使用 /SD 來指定一個上面列出的返回值當在卸載或安裝程序靜默卸載或安裝時作為返回值
舉個例子:卸載初始化的時候,提示是否卸載,
MessageBox MB_YESNO "確定要移除 $(^Name) ?" /SD IDYES IDYES +2格式為:
MessageBox MB_XX text [/SD IDXX] [IDXX target1] [IDXX target2] ...這樣就可以完成檢測并卸載的過程了,當卸載過程結束我們再執行安裝過程。
新聞熱點
疑難解答