NSIS(Nullsoft Scriptable Install System)是一个开源的 Windows 系统下安装程序制作程序。它提供了安装、卸载、系统设置、文件解压缩等功能。
使用NSIS安装脚本,确实能实现很多你想在安装过程中执行的操作。但是,NSIS脚本提供的功能是有限的,在他的脚本能力以外的功能,就必须借助额外的手段了。
总结下来,方法有几种。
1.利用NSIS自身的一些功能和提供的寄存器等,用类似汇编的手法写功能函数。
2.利用dll的方式借助于外部的函数。
3.调用预先准备好的exe和批处理在安装过程中执行。
其中第3中方法是最方便和快捷的,再配合已有的功能已经能完成我们需要的绝大部分任务了。而如果需要的功能能用批处理做,那是最好不过的,无论在便捷性上还是在性能上(想想dir的速度)。但是,用批处理有一个问题,即使进行的很快,也会有那个命令行窗口在屏幕上一闪而过,就会让用户感觉这安装包做的很不专业。用nsis直接调用bat而又没命令行窗口出现的方法我暂时没找到,但我们可以用点间接的方法。
如果有搞过vb的,就知道vb里面有一个功能,可以既执行批处理,又可以无声无息的,代码如下:
Set ws = CreateObject(”Wscript.Shell”)
ws.run “cmd /c ver>>” & chr(34) & “e:/boo k/test.txt” & chr(34),vbhide
首先创建shell对象,然后执行命令,cmd /c是指执行后面字符串指定的命令然后终止,再利用vbhide的方式,就能完美实现我们需要的功能。那& chr(34) 那个是什么呢?因为在例子里面,我们指定的路径是有空格的,所以在dos里面我们需要给这个路径加个引号,chr(34)其实就是一个引号,我们可以理解为,chr(34)是dos里面这条命令用到的引号,而ws.run “…”的引号是vb所用的引号。
好了,再复杂点。假如我们有一些变量是在安装过程中才能确定的(如部分根据情况不同的目录名和文件名),那我们用固定的vb脚本+批处理的方式就做不到了。还好,天无绝人之路,我们可以用NSIS去写一个vb脚本,因为是动态生成的vb脚本,我们所需要的变量就可以再这时候写到vb脚本里面去,然后再执行。NSIS的脚本如下,现在要做的是写一个dir /s的功能,为了演示,只用了$INSTDIR这个NSIS常用的变量(其实$INSTDIR可以直接在批处理里用./表示当前目录):
Push $0
FileOpen $0 $INSTDIR/test.vbs w
FileWrite $0 “Set ws = CreateObject($/”Wscript.Shell$/”)$/r$/n”
FileWrite $0 “ws.run $/”cmd /c dir $/” & chr(34) & $/”$INSTDIR$/” & chr(34) & $/”/s >> $/” & chr(34) & $/”$INSTDIR/test.txt$/” & chr(34),vbhide”
FileClose $0
nsExec::Exec /TIMEOUT=20000 ‘”$SYSDIR/cscript.exe” “$INSTDIR/test.vbs”‘
我们往test.vbs里面写了2行方式跟之前的vb脚本代码一样。要注意的是,每写一行,要记得加上$/r$/n,就是NSIS里面换行的符号,不要理所当然的以为分开2行写,写出来的vb代码就是分2行的:)。在第2行里面,我们把$INSTDIR作为“传”到批处理里面的变量。不过,第2行,我们史无前例的使用了3种引号,分别是NSIS里面直接使用的”,NSIS写到VB里用的$/”,VB给批处理用的chr(34),大家是不是有点晕了?呵呵,没办法,谁叫我们间接了2层呢。
最后,再用系统提供的cscript.exe执行下我们的脚本,OK大功告成!
原文链接:https://www.f2er.com/vb/262110.html