开门见山,B/S架构应用程序的安装程序无非就是拷贝一些文件,检查一下环境配置,注册服务,启动服务之类的了。拷贝文件就没什么好说的了。下面着记录一下如下几点:
- 端口检查
- 读写注册表
- 调用外部可执行文件
- 注册、启动、停止服务
- 注册环境变量
- 端口检查
${If} ${TCPPortOpen} $port
MessageBox MB_ICONINFORMATION|MB_OK "$portName端口号已经被使用,请使用新的端口"
abort
${EndIf}
这里面用到一个${TCPPortOpen}函数,需要使用到 !include Ports.nsh 头。 - 读写注册表
ReadRegStr $jdkReg HKLM "SOFTWARE\JavaSoft\Java Development Kit\1.6" JavaHome
这里面用到的ReadRegStr是一个内置函数,jdkReg用于存储读取的注册表项
WriteRegExpandStr HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment" "PATH" "$R0"
WriteRegExpandStr 也是一个内置函数,R0存储PATH值的变量 - 调用外部可执行文件
调用外部可执行文件可用于注册服务,例如注册Tomcat就需要调用service,bat 注册
ExecWait '"$INSTDIR\Tomcat\bin\service.bat" install Tomcat'
应用内部函数ExecWait执行service,bat,并传入两个参数 - 注册、启动、停止服务
!insertmacro SERVICE "create" "mysql5" 'path="$baseDir\MySQL\MySQL Server 5.1\bin\mysqld.exe" –defaults-file="$baseDir\MySQL\MySQL Server 5.1\my.ini" mysql5;autostart=1;interact=;depend=;user=;password=;display=mysql5;description=WayneWan DO IT!;'
应用SERVICE函数完成注册服务,需要头文件 !include Service.nsh
!insertmacro SERVICE "start" "mysql5" ""
启动服务,则参数改为 start
!insertmacro SERVICE "stop" "mysql5" ""
相应停止服务则用 stop - 注册环境变量
对于环境变量的注册则有一点点复杂,首先从NSIS安装程序中注册的环境变量,要想在后续步骤中使用,必须发送环境变量改变的广播,这样当前正在运行的进程才可能知道环境变量的改变。
插一句读取环境变量的方法:ReadEnvStr $R0 "PATH",这一句是吧PATH环境变量读到R0变量中,ReadEnvStr是一个内置函数。
其实注册环境变量也就是向相应的注册表项中写值,关键问题就在发广播。
WriteRegExpandStr HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment" "JAVA_HOME" "$jdkReg"
SendMessage ${HWND_BROADCAST} ${WM_WININICHANGE} 0 "STR:Environment" /TIMEOUT=100
第一句是添加环境变量,第二句式发送广播,后面的TIMEOUT好像是延时时间,没有深入研究。
ps:在我用这种方法注册环境变量过后发现后续步骤注册Tomcat服务的时候还是总读不到需要的环境变量,于是采取了一个变通办法,先用下面方法生成一个零时的环境变量。
System::Call 'Kernel32::SetEnvironmentVariableA(t, t) i("CATALINA_HOME", "$baseDir\Tomcat").r2'
这一句调用内部函数注册CATALINA_HOME零时环境变量$baseDir\Tomcat,至于后面r2没有搞懂是什么意思。
Leave a Reply