如何用NSIS打包程序

假如你有一个很棒的程序,能实现许多有趣的功能,你该怎么分享给你的好友呢,如果让你把庞大的工程传给他,我的天,那得传到什么时候?

于是,学会打包程序也成为程序员的一个必备技能了

在这里我用的是:NSIS(Nullsoft Scriptable Install System)+NIS Edit,下载请自行百度。

1、安装完毕,打开NIS Edit,点击文件,选择新建脚本:向导(W),如下图所示。

2、点击下一步,在这里相应更改,将应用程序名称填写*.exe文件名;软件版本、出版人、网站根据实际需要填写(若没有,则保留空白即可);程序标志会在安装界面的底部显示(若不需要也可选择不显示文本)。设置完成后选择下一步。

3、在下图中将安装语言选择为“simple chinese”,同时设置安装程序显示的图标,接着点击下一步:

4、只需修改自定义的授权文件,可自己新建一个txt或rft文件并写入一些软件授权信息或其他信息(文件内容在安装过程中会显示出来并让用户选择接受协议),其他保留默认设置。选择下一步

5、这一步是最关键的,关系到最终能否打包成功。将下图中的组名称修改为“主程序必选”,描述信息可写可不写,同时将箭头所指中 "c:\path\to\file\AppMainExe.exe", c:\path\to\file\Example.file 都删除,允许用户选择要安装的组件。最后点击上方的树形图按钮

点击树形目录,这里选择要发布的*.exe程序所在目录(最好将发布程序时所有用到的文件均拷贝到该目录下,都放到一个目录下,即绿色版的目录),并选中"包含子目录"以及"单独添加每个文件(如果有)" ,其余保留默认设置。 然后选择确定,加载完目录下所有文件后,点击下一步

6、这一步可保留所有默认设置(默认生成开始菜单和桌面快捷方式),我在实际中用的是SZPT,方便自己查询,这个根据个人需要,然后选择下一步

7、可保留默认设置(当然也可添加一些自定义的自述,如汉化说明等等),选择下一步

8、在图中只需要修改自定义的卸载程序图标就可以了,其他项保留默认设置,选择下一步

9、选择“保存脚本”,“转换文件路径到相对路径”,“编译脚本”,然后用NIS Edit进行编译,执行打包过程,最后生成成功,点击Setup.exe运行即可安装。

注意:如果想在程序安装的时候需要进行.NET FRAMEWORK的判断及静默安装,则需要在nsi脚本中添加如下代码:

 
  1. Function GetNetFrameworkVersion

  2. ;获取.Net Framework版本支持

  3. Push $1

  4. Push $0

  5. ReadRegDWORD $0 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full" "Install"

  6. ReadRegDWORD $1 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full" "Version"

  7. StrCmp $0 1 KnowNetFrameworkVersion +1

  8. ReadRegDWORD $0 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v3.5" "Install"

  9. ReadRegDWORD $1 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v3.5" "Version"

  10. StrCmp $0 1 KnowNetFrameworkVersion +1

  11. ReadRegDWORD $0 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v3.0\Setup" "InstallSuccess"

  12. ReadRegDWORD $1 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v3.0\Setup" "Version"

  13. StrCmp $0 1 KnowNetFrameworkVersion +1

  14. ReadRegDWORD $0 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v2.0.50727" "Install"

  15. ReadRegDWORD $1 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v2.0.50727" "Version"

  16. StrCmp $1 "" +1 +2

  17. StrCpy $1 "2.0.50727.832"

  18. StrCmp $0 1 KnowNetFrameworkVersion +1

  19. ReadRegDWORD $0 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v1.1.4322" "Install"

  20. ReadRegDWORD $1 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v1.1.4322" "Version"

  21. StrCmp $1 "" +1 +2

  22. StrCpy $1 "1.1.4322.573"

  23. StrCmp $0 1 KnowNetFrameworkVersion +1

  24. ReadRegDWORD $0 HKLM "SOFTWARE\Microsoft\.NETFramework\policy\v1.0" "Install"

  25. ReadRegDWORD $1 HKLM "SOFTWARE\Microsoft\.NETFramework\policy\v1.0" "Version"

  26. StrCmp $1 "" +1 +2

  27. StrCpy $1 "1.0.3705.0"

  28. StrCmp $0 1 KnowNetFrameworkVersion +1

  29. StrCpy $1 "not .NetFramework"

  30. KnowNetFrameworkVersion:

  31. Pop $0

  32. Exch $1

  33. FunctionEnd

安装程序是判断当前电脑是否已安装程序,是否卸载

 
  1. Var UNINSTALL_PROG

  2. Var OLD_VER

  3. Var OLD_PATH

  4. Function .onInit

  5. ClearErrors

  6. ReadRegStr $UNINSTALL_PROG ${PRODUCT_UNINST_ROOT_KEY} ${PRODUCT_UNINST_KEY} "UninstallString"

  7. IfErrors done

  8.  
  9. ReadRegStr $OLD_VER ${PRODUCT_UNINST_ROOT_KEY} ${PRODUCT_UNINST_KEY} "DisplayVersion"

  10. MessageBox MB_YESNOCANCEL|MB_ICONQUESTION \

  11. "检测到本机已经安装了 ${PRODUCT_NAME} $OLD_VER。\

  12. $\n$\n是否先卸载已安装的版本?" \

  13. /SD IDYES \

  14. IDYES uninstall \

  15. IDNO done

  16. Abort

  17.  
  18. uninstall:

  19. StrCpy $OLD_PATH $UNINSTALL_PROG -10

  20.  
  21. ExecWait '"$UNINSTALL_PROG" /S _?=$OLD_PATH' $0

  22. DetailPrint "uninst.exe returned $0"

  23. Delete "$UNINSTALL_PROG"

  24. RMDir $OLD_PATH

  25.  
  26.  
  27. done:

  28. FunctionEnd

以上代码可以放在Section "主程序必选" SEC01之前,然后在进行编译脚本。

如果要运行批处理,且需要在安装路径运行,可添加以下代码:

 
  1. Section "生成机器码"

  2. #SetOutPath "$INSTDIR\runHID.bat"

  3. #nsExec::Exec "$INSTDIR\runHID.bat"

  4. SetOutPath '$INSTDIR'

  5. ExecWait '$INSTDIR/runHID.bat'

  6. SectionEnd

此段代码看放在主文件安装函数之后

编译成功

显示Total size xxx/xxxx (xxx%)

问:如何运行一个批处理文件 .bat
答:注:your.bat为文件名 
ExecWait "your.bat"
不显示黑框框 
nsExec::Exec "your.bat"

猜你喜欢

转载自blog.csdn.net/bruce135lee/article/details/81977915