使用 NSIS 制作软件安装包
NSIS(Nullsoft Scriptable Install System)是一個開源的 Windows 系統下安裝程序制作程序。它提供了安裝、卸載、系統設置、文件解壓縮等功能。這如其名字所指出的那樣,NSIS 是通過它的腳本語言來描述安裝程序的行為和邏輯的。NSIS 的腳本語言和通常的編程語言有類似的結構和語法,但它是為安裝程序這類應用所設計的。
http://nsis.sourceforge.net/Download/
先在官網下載NSIS安裝,然后再下載NIS Edit
HM NIS Edit is the best Editor/IDE for Nullsoft Scriptable Install System (NSIS).
NIS Edit 就是一個界面編輯器,最終編譯還是靠NSIS來完成
制作簡單的安裝包: 在NIS Edit中,選擇“文件”菜單中的 “新建腳本:向導“
填寫軟件基本信息
設置圖標與輸出文件,以及安裝界面的語言
設置安裝目錄以及安裝時的界面提示信息
添加要安裝的文件
卸載界面
向導完成后編譯即可生成一個基本的安裝文件,包含開始菜單與桌面的快捷方式,卸載程序
------------------------------------------------------------- ?進階 ?----------------------------------------------------------------------
在卸載時,進行指定目錄的刪除
安裝程序后,可能有會生成一些文件在安裝目錄,或者要刪除其它位置的文件
在腳本文件加入刪除指令,如:
RMDIR /r /REBOOTOK "$INSTDIR"
RMDIR /r /REBOOTOK "$LOCALAPPDATA\XXSof"
將
C:\Program Files (x86)\XXSof (程序安裝目錄)
C:\Users\liyulin\AppData\Local\XXSof (程序數據放置的位置)
進行刪除
RMDir
[/r] [/REBOOTOK] 目錄名
刪除指定的目錄(沒有通配符的完整路徑)。沒有 /r 參數時只有在目錄為空時才會被刪除。如果指定了 /r ,則目錄會被遞歸刪除,所以在指定目錄下的所有文件和目錄均被刪除。如果指定了 /REBOOTOK ,任何當前不能刪除的文件或目錄將會在重啟后被刪除 -- 如果文件或目錄需要在重啟時被刪除,會放置一個重啟的標記。當文件或目錄不能被刪除時放置一個錯誤的標記。
RMDir $INSTDIR
RMDir $INSTDIR\data
RMDir /r /REBOOTOK $INSTDIR
RMDir /REBOOTOK $INSTDIR\DLLs
需要注意的是當前的工作目錄不能刪除。當前的工作目錄由 SetOutPath 設定。例如,下面的例子將不能刪除該目錄。
SetOutPath $TEMP\dir
RMDir $TEMP\dir
而下面的例子將成功地刪除該目錄。
SetOutPath $TEMP\dir
SetOutPath $TEMP
RMDir $TEMP\dir
警告: 在卸載程序中使用 RMDir /r $INSTDIR 是不安全的。雖然用戶不太可能會選擇將程序安裝到 Program Files 文件夾中,但假如這樣的話,這個命令將會遞歸刪除整個 Program Files 文件夾,包括其他和卸載程序沒有任何關系的程序(目錄)。用戶還可以安裝除了程序文件之外的其他文件并希望它們能被卸載程序刪除。可用的 解決方案 可以輕松地實現只卸載由安裝程序釋放的唯一文件。
無法創建桌面快捷方式或無法刪除開始菜單項
用戶將桌面文件轉移了,如:?D:\Doc\Desktop ?,安裝程序后,桌面不會生成快捷方式, 或者卸載后,開始菜單中的文件也不會被刪除
NSIS卸載后無法刪除開始菜單中的內容
原因:
因為NSIS中使用CreateShortCut創建快捷方式時會在每一個人用戶下面都創建快捷方式,然后Delete刪的時候卻只是在當前用戶下,因此怎么刪也刪不掉。
解決方案:
刪除所有用戶下的快捷方式。首先添加RequestExecutionLevel admin,然后在創建快捷方式和刪除快捷方式的地方加上SetShellVarContext all即可。
在軟件已安裝的情況下,再次安裝,進行提示:
NSIS制作安裝包,如何檢測并卸載已有版本 - CrazyCoder,s blog - 博客頻道 - CSDN.NET?http://t.cn/zRodHPeNSIS制作安裝包,如何檢測并卸載已有版本
將如下代碼追加到NSIS腳本的尾部即可。
Var UNINSTALL_PROG
Var OLD_VER
Var OLD_PATH
Function .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
Abort
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
done:
FunctionEnd
程序正在運行時進行安裝或者卸載
NSIS:安裝、卸載時檢查程序是否正在運行 - 輕狂志 http://t.cn/RLsWJmP
如果我們要安裝或升級的程序正在運行,文件肯定會替換失敗,以下代碼可以提示用戶結束正在運行的程序。
需要使用插件FindProcDLL.dll,下載路徑:http://nsis.sourceforge.net/FindProcDLL_plug-in
下載完后,放入NSIS的插件目錄下: 如 ?C:\Program Files (x86)\NSIS\Plugins
開始安裝時檢查flighty.exe是否正在運行:
Function .onInit
? ;關閉進程
? Push $R0
? CheckProc:
? ? Push "flighty.exe"
? ? ProcessWork::existsprocess
? ? Pop $R0
? ? IntCmp $R0 0 Done
? ? MessageBox MB_OKCANCEL|MB_ICONSTOP "安裝程序檢測到 ${PRODUCT_NAME} 正在運行。$\r$\n$\r$\n點擊 “確定” 強制關閉${PRODUCT_NAME},繼續安裝。$\r$\n點擊 “取消” 退出安裝程序。" IDCANCEL Exit
? ? Push "flighty.exe"
? ? Processwork::KillProcess
? ? Sleep 1000
? ? Goto CheckProc
? ? Exit:
? ? Abort
? ? Done:
? ? Pop $R0
FunctionEnd
開始卸載時檢查flighty.exe是否正在運行:
Function un.onInit
? MessageBox MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON2 "您確實要完全移除 $(^Name) ,及其所有的組件?" IDYES +2
? Abort
? ;檢測程序是否運行
? FindProcDLL::FindProc "flighty.exe"
? ?Pop $R0
? ?IntCmp $R0 1 0 no_run
? ?MessageBox MB_ICONSTOP "卸載程序檢測到 ${PRODUCT_NAME} 正在運行,請關閉之后再卸載!"
? ?Quit
? ?no_run:
FunctionEnd
若需要將:
在軟件已安裝的情況下,再次安裝,進行提示
程序正在運行時進行安裝或者卸載
兩個功能都需要的話,則需要將程序進行合并: 結果為:
Var UNINSTALL_PROG
Var OLD_VER
Var OLD_PATH
Function .onInit
FindProcDLL::FindProc "${PRODUCT_NAME}.exe"
? ?Pop $R0
? ?IntCmp $R0 1 0 no_run
? ?MessageBox MB_ICONSTOP "安裝程序檢測到 ${PRODUCT_NAME} 正在運行,請退出程序后重試"
? ?Quit
? ?no_run:
;FunctionEnd
;Function .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
? Abort
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
done:
FunctionEnd
Function un.onInit
? ?FindProcDLL::FindProc "${PRODUCT_NAME}.exe"
? ?Pop $R0
? ?IntCmp $R0 1 0 no_run
? ?MessageBox MB_ICONSTOP "安裝程序檢測到 ${PRODUCT_NAME} 正在運行,請退出程序后重試"
? ?Quit
? ?no_run:
? ?
? MessageBox MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON2 "你確實要完全移除 $(^Name) ,其及所有的組件?" IDYES +2
? Abort
??
FunctionEnd
************************* ?生成的腳本文件(簡化) **************************************************************
; Script generated by the HM NIS Edit Script Wizard.
; HM NIS Edit Wizard helper defines
!define PRODUCT_NAME "XXSof"
!define PRODUCT_VERSION "1.0"
!define PRODUCT_PUBLISHER "My company, Inc."
!define PRODUCT_WEB_SITE "http://www.KeeShow.com"
!define PRODUCT_DIR_REGKEY "Software\Microsoft\Windows\CurrentVersion\App Paths\XXSof.exe"
!define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}"
!define PRODUCT_UNINST_ROOT_KEY "HKLM"
; MUI 1.67 compatible ------
!include "MUI.nsh"
; MUI Settings
!define MUI_ABORTWARNING
!define MUI_ICON "F:\XXSof.ico"
!define MUI_UNICON "F:\Uninstall.ico"
; Welcome page
!insertmacro MUI_PAGE_WELCOME
; License page
!insertmacro MUI_PAGE_LICENSE "XXSof\readme.txt"
; Directory page
!insertmacro MUI_PAGE_DIRECTORY
; Instfiles page
!insertmacro MUI_PAGE_INSTFILES
; Finish page
!define MUI_FINISHPAGE_RUN "$INSTDIR\XXSof.exe"
!insertmacro MUI_PAGE_FINISH
; Uninstaller pages
!insertmacro MUI_UNPAGE_INSTFILES
; Language files
!insertmacro MUI_LANGUAGE "SimpChinese"
; MUI end ------
RequestExecutionLevel admin
Name "${PRODUCT_NAME} ${PRODUCT_VERSION}"
OutFile "XXSofSetup.exe"
InstallDir "$PROGRAMFILES\XXSof"
InstallDirRegKey HKLM "${PRODUCT_DIR_REGKEY}" ""
ShowInstDetails show
ShowUnInstDetails show
Section "XXSof" SEC01
? SetOutPath "$INSTDIR"
? File "XXSof\config.xml"?
? File "XXSof\XXSof.exe"
? File "XXSof\libcurl.dll"
? File "XXSof\Model.dll"
? File "XXSof\OpenAL32.dll"
? File "XXSof\OpenThreads.dll"
? SetOutPath "$INSTDIR\platforms"
? File "XXSof\platforms\qminimal.dll"
? File "XXSof\platforms\qoffscreen.dll"
? File "XXSof\platforms\qwindows.dll"
? SetOutPath "$INSTDIR\QtQuick\Dialogs"
? File "XXSof\QtQuick\Dialogs\DefaultColorDialog.qml"
? File "XXSof\QtQuick\Dialogs\DefaultDialogWrapper.qml"
? File "XXSof\QtQuick\Dialogs\DefaultFileDialog.qml"
? File "XXSof\QtQuick\Dialogs\DefaultFontDialog.qml"
? File "XXSof\QtQuick\Dialogs\DefaultMessageDialog.qml"
? File "XXSof\QtQuick\Dialogs\dialogplugin.dll"
SectionEnd
Section -AdditionalIcons
? SetShellVarContext all
? WriteIniStr "$INSTDIR\${PRODUCT_NAME}.url" "InternetShortcut" "URL" "${PRODUCT_WEB_SITE}"
? CreateShortCut "$SMPROGRAMS\XXSof\Website.lnk" "$INSTDIR\${PRODUCT_NAME}.url"
? CreateShortCut "$SMPROGRAMS\XXSof\Uninstall.lnk" "$INSTDIR\uninst.exe"
? CreateShortCut "$DESKTOP\XXSof.lnk" "$INSTDIR\XXSof.exe" "F:\XXSof.ico"
? CreateDirectory "$SMPROGRAMS\XXSof"
? CreateShortCut "$SMPROGRAMS\XXSof\XXSof.lnk" "$INSTDIR\XXSof.exe"
? CreateShortCut "$SMPROGRAMS\XXSof\Website.lnk" "$INSTDIR\${PRODUCT_NAME}.url"
? CreateShortCut "$SMPROGRAMS\XXSof\Uninstall.lnk" "$INSTDIR\uninst.exe"
SectionEnd
Section -Post
? WriteUninstaller "$INSTDIR\uninst.exe"
? WriteRegStr HKLM "${PRODUCT_DIR_REGKEY}" "" "$INSTDIR\XXSof.exe"
? WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayName" "$(^Name)"
? WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "UninstallString" "$INSTDIR\uninst.exe"
? WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayIcon" "$INSTDIR\XXSof.exe"
? WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayVersion" "${PRODUCT_VERSION}"
? WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "URLInfoAbout" "${PRODUCT_WEB_SITE}"
? WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "Publisher" "${PRODUCT_PUBLISHER}"
SectionEnd
Function un.onUninstSuccess
? HideWindow
? MessageBox MB_ICONINFORMATION|MB_OK "$(^Name) 已成功地從你的計算機移除。"
FunctionEnd
Function un.onInit
? ?FindProcDLL::FindProc "${PRODUCT_NAME}.exe"
? ?Pop $R0
? ?IntCmp $R0 1 0 no_run
? ?MessageBox MB_ICONSTOP "安裝程序檢測到 ${PRODUCT_NAME} 正在運行,請退出程序后重試"
? ?Quit
? ?no_run:
? ?
? MessageBox MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON2 "你確實要完全移除 $(^Name) ,其及所有的組件?" IDYES +2
? Abort
??
FunctionEnd
Section Uninstall
? Delete "$INSTDIR\${PRODUCT_NAME}.url"
? Delete "$INSTDIR\uninst.exe"
? Delete "$INSTDIR\Upgrade.exe"
? Delete "$INSTDIR\Render.dll"
? Delete "$INSTDIR\readme.txt"
? Delete "$INSTDIR\qwindows.dll"
? Delete "$INSTDIR\QtQuick.2\qtquick2plugin.dll"
? Delete "$INSTDIR\imageformats\qjpeg.dll"
? Delete "$INSTDIR\imageformats\qgif.dll"
? Delete "$INSTDIR\icuuc52.dll"
? Delete "$INSTDIR\icuin52.dll"
? Delete "$INSTDIR\icudt52.dll"
? Delete "$INSTDIR\glew32.dll"
? Delete "$INSTDIR\FreeImage.dll"
? Delete "$INSTDIR\Enginio.dll"
? Delete "$INSTDIR\Core.dll"
? Delete "$INSTDIR\config.xml"
? SetShellVarContext all
? Delete "$SMPROGRAMS\XXSof\Uninstall.lnk"
? Delete "$SMPROGRAMS\XXSof\Website.lnk"
? Delete "$DESKTOP\XXSof.lnk"
? Delete "$SMPROGRAMS\XXSof\XXSof.lnk"
? RMDir "$SMPROGRAMS\XXSof"
? RMDir "$INSTDIR\QtQuick\XmlListModel"
? RMDir "$INSTDIR\QtQuick\Window.2"
? RMDir "$INSTDIR\QtQuick\PrivateWidgets"
? RMDir "$INSTDIR\QtQuick\Particles.2"
? RMDir "$INSTDIR\QtQuick\LocalStorage"
? RMDir "$INSTDIR\QtQuick\Layouts"
? RMDir "$INSTDIR\QtQuick\Dialogs\qml"
? RMDir "$INSTDIR\QtQuick\Controls\Private"
? RMDir "$INSTDIR\QtQuick\Controls"
? RMDir "$INSTDIR\QtQuick.2"
? RMDir "$INSTDIR\platforms"
? RMDir "$INSTDIR\imageformats"
? RMDir "$INSTDIR"
??
? RMDIR /r /REBOOTOK "$INSTDIR"
? RMDIR /r /REBOOTOK "$LOCALAPPDATA\XXSof"
??
? DeleteRegKey ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}"
? DeleteRegKey HKLM "${PRODUCT_DIR_REGKEY}"
? SetAutoClose true
SectionEnd
Var UNINSTALL_PROG
Var OLD_VER
Var OLD_PATH
Function .onInit
FindProcDLL::FindProc "${PRODUCT_NAME}.exe"
? ?Pop $R0
? ?IntCmp $R0 1 0 no_run
? ?MessageBox MB_ICONSTOP "安裝程序檢測到 ${PRODUCT_NAME} 正在運行,請退出程序后重試"
? ?Quit
? ?no_run:
;FunctionEnd
;Function .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
? Abort
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
done:
FunctionEnd
更改NSIS的安裝過程圖片_百度知道 http://t.cn/RLsjaVQ
總結
以上是生活随笔為你收集整理的使用 NSIS 制作软件安装包的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: pytho_抓取下载音乐歌曲
- 下一篇: 艾宾浩斯遗忘曲线PHP,艾宾浩斯记忆遗忘