假如你有一个很棒的程序,能实现许多有趣的功能,你该怎么分享给你的好友呢,如果让你把庞大的工程传给他,我的天,那得传到什么时候?
于是,学会打包程序也成为程序员的一个必备技能了
在这里我用的是: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脚本中添加如下代码:
-
Function GetNetFrameworkVersion
-
;获取.Net Framework版本支持
-
Push $1
-
Push $0
-
ReadRegDWORD $0 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full" "Install"
-
ReadRegDWORD $1 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full" "Version"
-
StrCmp $0 1 KnowNetFrameworkVersion +1
-
ReadRegDWORD $0 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v3.5" "Install"
-
ReadRegDWORD $1 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v3.5" "Version"
-
StrCmp $0 1 KnowNetFrameworkVersion +1
-
ReadRegDWORD $0 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v3.0\Setup" "InstallSuccess"
-
ReadRegDWORD $1 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v3.0\Setup" "Version"
-
StrCmp $0 1 KnowNetFrameworkVersion +1
-
ReadRegDWORD $0 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v2.0.50727" "Install"
-
ReadRegDWORD $1 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v2.0.50727" "Version"
-
StrCmp $1 "" +1 +2
-
StrCpy $1 "2.0.50727.832"
-
StrCmp $0 1 KnowNetFrameworkVersion +1
-
ReadRegDWORD $0 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v1.1.4322" "Install"
-
ReadRegDWORD $1 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v1.1.4322" "Version"
-
StrCmp $1 "" +1 +2
-
StrCpy $1 "1.1.4322.573"
-
StrCmp $0 1 KnowNetFrameworkVersion +1
-
ReadRegDWORD $0 HKLM "SOFTWARE\Microsoft\.NETFramework\policy\v1.0" "Install"
-
ReadRegDWORD $1 HKLM "SOFTWARE\Microsoft\.NETFramework\policy\v1.0" "Version"
-
StrCmp $1 "" +1 +2
-
StrCpy $1 "1.0.3705.0"
-
StrCmp $0 1 KnowNetFrameworkVersion +1
-
StrCpy $1 "not .NetFramework"
-
KnowNetFrameworkVersion:
-
Pop $0
-
Exch $1
-
FunctionEnd
安装程序是判断当前电脑是否已安装程序,是否卸载
-
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
以上代码可以放在Section "主程序必选" SEC01之前,然后在进行编译脚本。
如果要运行批处理,且需要在安装路径运行,可添加以下代码:
-
Section "生成机器码"
-
#SetOutPath "$INSTDIR\runHID.bat"
-
#nsExec::Exec "$INSTDIR\runHID.bat"
-
SetOutPath '$INSTDIR'
-
ExecWait '$INSTDIR/runHID.bat'
-
SectionEnd
此段代码看放在主文件安装函数之后
编译成功
显示Total size xxx/xxxx (xxx%)
问:如何运行一个批处理文件 .bat
答:注:your.bat为文件名
ExecWait "your.bat"
不显示黑框框
nsExec::Exec "your.bat"