使用 NSIS 制作软件安装包
NSIS(Nullsoft Scriptable Install System)是一個(gè)開源的 Windows 系統(tǒng)下安裝程序制作程序。它提供了安裝、卸載、系統(tǒng)設(shè)置、文件解壓縮等功能。這如其名字所指出的那樣,NSIS 是通過它的腳本語言來描述安裝程序的行為和邏輯的。NSIS 的腳本語言和通常的編程語言有類似的結(jié)構(gòu)和語法,但它是為安裝程序這類應(yīng)用所設(shè)計(jì)的。
http://nsis.sourceforge.net/Download/
先在官網(wǎng)下載NSIS安裝,然后再下載NIS Edit
HM NIS Edit is the best Editor/IDE for Nullsoft Scriptable Install System (NSIS).
NIS Edit 就是一個(gè)界面編輯器,最終編譯還是靠NSIS來完成
制作簡(jiǎn)單的安裝包: 在NIS Edit中,選擇“文件”菜單中的 “新建腳本:向?qū)А?/p>
填寫軟件基本信息
設(shè)置圖標(biāo)與輸出文件,以及安裝界面的語言
設(shè)置安裝目錄以及安裝時(shí)的界面提示信息
添加要安裝的文件
卸載界面
向?qū)瓿珊缶幾g即可生成一個(gè)基本的安裝文件,包含開始菜單與桌面的快捷方式,卸載程序
------------------------------------------------------------- ?進(jìn)階 ?----------------------------------------------------------------------
在卸載時(shí),進(jìn)行指定目錄的刪除
安裝程序后,可能有會(huì)生成一些文件在安裝目錄,或者要?jiǎng)h除其它位置的文件
在腳本文件加入刪除指令,如:
RMDIR /r /REBOOTOK "$INSTDIR"
RMDIR /r /REBOOTOK "$LOCALAPPDATA\XXSof"
將
C:\Program Files (x86)\XXSof (程序安裝目錄)
C:\Users\liyulin\AppData\Local\XXSof (程序數(shù)據(jù)放置的位置)
進(jìn)行刪除
RMDir
[/r] [/REBOOTOK] 目錄名
刪除指定的目錄(沒有通配符的完整路徑)。沒有 /r 參數(shù)時(shí)只有在目錄為空時(shí)才會(huì)被刪除。如果指定了 /r ,則目錄會(huì)被遞歸刪除,所以在指定目錄下的所有文件和目錄均被刪除。如果指定了 /REBOOTOK ,任何當(dāng)前不能刪除的文件或目錄將會(huì)在重啟后被刪除 -- 如果文件或目錄需要在重啟時(shí)被刪除,會(huì)放置一個(gè)重啟的標(biāo)記。當(dāng)文件或目錄不能被刪除時(shí)放置一個(gè)錯(cuò)誤的標(biāo)記。
RMDir $INSTDIR
RMDir $INSTDIR\data
RMDir /r /REBOOTOK $INSTDIR
RMDir /REBOOTOK $INSTDIR\DLLs
需要注意的是當(dāng)前的工作目錄不能刪除。當(dāng)前的工作目錄由 SetOutPath 設(shè)定。例如,下面的例子將不能刪除該目錄。
SetOutPath $TEMP\dir
RMDir $TEMP\dir
而下面的例子將成功地刪除該目錄。
SetOutPath $TEMP\dir
SetOutPath $TEMP
RMDir $TEMP\dir
警告: 在卸載程序中使用 RMDir /r $INSTDIR 是不安全的。雖然用戶不太可能會(huì)選擇將程序安裝到 Program Files 文件夾中,但假如這樣的話,這個(gè)命令將會(huì)遞歸刪除整個(gè) Program Files 文件夾,包括其他和卸載程序沒有任何關(guān)系的程序(目錄)。用戶還可以安裝除了程序文件之外的其他文件并希望它們能被卸載程序刪除。可用的 解決方案 可以輕松地實(shí)現(xiàn)只卸載由安裝程序釋放的唯一文件。
無法創(chuàng)建桌面快捷方式或無法刪除開始菜單項(xiàng)
用戶將桌面文件轉(zhuǎn)移了,如:?D:\Doc\Desktop ?,安裝程序后,桌面不會(huì)生成快捷方式, 或者卸載后,開始菜單中的文件也不會(huì)被刪除
NSIS卸載后無法刪除開始菜單中的內(nèi)容
原因:
因?yàn)镹SIS中使用CreateShortCut創(chuàng)建快捷方式時(shí)會(huì)在每一個(gè)人用戶下面都創(chuàng)建快捷方式,然后Delete刪的時(shí)候卻只是在當(dāng)前用戶下,因此怎么刪也刪不掉。
解決方案:
刪除所有用戶下的快捷方式。首先添加RequestExecutionLevel admin,然后在創(chuàng)建快捷方式和刪除快捷方式的地方加上SetShellVarContext all即可。
在軟件已安裝的情況下,再次安裝,進(jìn)行提示:
NSIS制作安裝包,如何檢測(cè)并卸載已有版本 - CrazyCoder,s blog - 博客頻道 - CSDN.NET?http://t.cn/zRodHPeNSIS制作安裝包,如何檢測(cè)并卸載已有版本
將如下代碼追加到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 \
"檢測(cè)到本機(jī)已經(jīng)安裝了 ${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
程序正在運(yùn)行時(shí)進(jìn)行安裝或者卸載
NSIS:安裝、卸載時(shí)檢查程序是否正在運(yùn)行 - 輕狂志 http://t.cn/RLsWJmP
如果我們要安裝或升級(jí)的程序正在運(yùn)行,文件肯定會(huì)替換失敗,以下代碼可以提示用戶結(jié)束正在運(yùn)行的程序。
需要使用插件FindProcDLL.dll,下載路徑:http://nsis.sourceforge.net/FindProcDLL_plug-in
下載完后,放入NSIS的插件目錄下: 如 ?C:\Program Files (x86)\NSIS\Plugins
開始安裝時(shí)檢查flighty.exe是否正在運(yùn)行:
Function .onInit
? ;關(guān)閉進(jìn)程
? Push $R0
? CheckProc:
? ? Push "flighty.exe"
? ? ProcessWork::existsprocess
? ? Pop $R0
? ? IntCmp $R0 0 Done
? ? MessageBox MB_OKCANCEL|MB_ICONSTOP "安裝程序檢測(cè)到 ${PRODUCT_NAME} 正在運(yùn)行。$\r$\n$\r$\n點(diǎn)擊 “確定” 強(qiáng)制關(guān)閉${PRODUCT_NAME},繼續(xù)安裝。$\r$\n點(diǎn)擊 “取消” 退出安裝程序。" IDCANCEL Exit
? ? Push "flighty.exe"
? ? Processwork::KillProcess
? ? Sleep 1000
? ? Goto CheckProc
? ? Exit:
? ? Abort
? ? Done:
? ? Pop $R0
FunctionEnd
開始卸載時(shí)檢查flighty.exe是否正在運(yùn)行:
Function un.onInit
? MessageBox MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON2 "您確實(shí)要完全移除 $(^Name) ,及其所有的組件?" IDYES +2
? Abort
? ;檢測(cè)程序是否運(yùn)行
? FindProcDLL::FindProc "flighty.exe"
? ?Pop $R0
? ?IntCmp $R0 1 0 no_run
? ?MessageBox MB_ICONSTOP "卸載程序檢測(cè)到 ${PRODUCT_NAME} 正在運(yùn)行,請(qǐng)關(guān)閉之后再卸載!"
? ?Quit
? ?no_run:
FunctionEnd
若需要將:
在軟件已安裝的情況下,再次安裝,進(jìn)行提示
程序正在運(yùn)行時(shí)進(jìn)行安裝或者卸載
兩個(gè)功能都需要的話,則需要將程序進(jìn)行合并: 結(jié)果為:
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 "安裝程序檢測(cè)到 ${PRODUCT_NAME} 正在運(yùn)行,請(qǐng)退出程序后重試"
? ?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 \
? ? "檢測(cè)到本機(jī)已經(jīng)安裝了 ${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 "安裝程序檢測(cè)到 ${PRODUCT_NAME} 正在運(yùn)行,請(qǐng)退出程序后重試"
? ?Quit
? ?no_run:
? ?
? MessageBox MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON2 "你確實(shí)要完全移除 $(^Name) ,其及所有的組件?" IDYES +2
? Abort
??
FunctionEnd
************************* ?生成的腳本文件(簡(jiǎn)化) **************************************************************
; 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) 已成功地從你的計(jì)算機(jī)移除。"
FunctionEnd
Function un.onInit
? ?FindProcDLL::FindProc "${PRODUCT_NAME}.exe"
? ?Pop $R0
? ?IntCmp $R0 1 0 no_run
? ?MessageBox MB_ICONSTOP "安裝程序檢測(cè)到 ${PRODUCT_NAME} 正在運(yùn)行,請(qǐng)退出程序后重試"
? ?Quit
? ?no_run:
? ?
? MessageBox MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON2 "你確實(shí)要完全移除 $(^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 "安裝程序檢測(cè)到 ${PRODUCT_NAME} 正在運(yùn)行,請(qǐng)退出程序后重試"
? ?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 \
? ? "檢測(cè)到本機(jī)已經(jīng)安裝了 ${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
總結(jié)
以上是生活随笔為你收集整理的使用 NSIS 制作软件安装包的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: pytho_抓取下载音乐歌曲
- 下一篇: ggplot2 画图 X 轴排序问题