过节前,发现一个问题,NSIS写的安装程序在Window Server 2012环境下,在最后的配置阶段不能响应,占用CPU30~40%的样子。
当时有点一筹莫展,没有找到其他地方提到过遇到这类问题,而同样的程序在Windows 8下可以正常完成安装。
没有办法,只能一点一点地先查出大概问题出来哪个阶段、哪个函数,然后依次往下减可能出问题的地方。之前最严重怀疑的出问题的地方竟然不是,最终查出来是拷贝文件导致出现这个现象。这个结果完全没有预料到。
本来是怕调用ExeWait执行可执行程序出问题,但其实不是。不过在查用函数代替ExeWait时,查到了拷贝文件的不同方法:
出问题的方式是
CopyFiles "$INSTDIR\xxx" "$INSTDIR\xxx.cfg"
意思是把安装目录下的xxx文件拷贝为xxx.cfg。
改为另一种方式
nsExec::ExecToLog 'cmd.exe /c copy "$INSTDIR\xxx" "$INSTDIR\xxx.cfg"'
就不会出现安装程序死在那里的现象了。
虽然原因找到了,而且在一点一点把配置阶段所有的拷贝文件语句改成新的后,问题确实解决了。但是深层的真正原因我还是没有找到,并百思不得其解。
实际上,CopyFile在安装程序中依然使用着,只不过是在拷贝文件的阶段使用的。
差别可能包括,拷贝文件阶段拷贝文件是在该段中直接调用拷贝函数;而配置阶段对文件的拷贝操作是在几层函数调用后执行的,难道和这个有关系?可以再试验一下。