Inno Setup制作的安装程序在安装时能记录安装内容,生成unins000.dat之类的文件,卸载时直接调用它。这样可以避免卸载时误删文件。
NSIS
的卸载段一般是手写,如果安装程序包含的文件很多,一般就直接删除整个安装目录,或者逐个删除子目录,再逐个删除安装目录下的各个文件。这样存在误删除文
件的危险性。比如如果用户将文件存放在驱动器根目录下,如果整个删除安装目录,那就将一个驱动器的东西都删光了!况且更新维护脚本的同时需要考虑到卸载段
的更改,个人觉得是比较麻烦。
这也是我不太喜欢NSIS的原因之一。(还有另一个重要原因是NSIS制作的安装程序在安装时如果“取消”了安装,将不能回复到安装前的状态,而INNO可以哦!这和本文无关~)
其实NSIS也提供了LOG功能,只是在正式发行版本里没有开启,必须使用它的特殊编译器。而这个Special Build官方早就为你想到了,在NSIS的全部文件下载页面里就有:http://sourceforge.net/project/showfiles.php?group_id=22049
其中每个版本出来,都有个LOG.zip。 如 nsis-2.37-log.zip ,这就是2.37版的开启LOG功能的版本。安装了正式发行的版本,再解包这个LOG的ZIP文件到安装目录,覆盖掉原文件。
如何使用这个功能?
HM VNISEdit 的向导可以自动生成“安全卸载”的代码,就是以下的内容:
1、在普通安装脚本前添加库
!include "LogicLib.nsh"
2、; 激活安装日志记录,该日志文件将会作为卸载文件的依据(注意,本区段必须放置在所有区段之前)
Section "-LogSetOn"
LogSet on
SectionEnd
3、
/******************************
* 以下是安装程序的卸载部分 *
******************************/
; 根据安装日志卸载文件的调用宏
!macro DelFileByLog LogFile
ifFileExists `${LogFile}` 0 +4
Push `${LogFile}`
Call un.DelFileByLog
Delete `${LogFile}`
!macroend
Section Uninstall
!insertmacro MUI_STARTMENU_GETFOLDER "Application" $ICONS_GROUP
Delete "$INSTDIR\${PRODUCT_NAME}.url"
; 调用宏只根据安装日志卸载安装程序自己安装过的文件
!insertmacro DelFileByLog "$INSTDIR\install.log"
; 清除安装程序创建的且在卸载时可能为空的子目录,对于递归添加的文件目录,请由最内层的子目录开始清除(注意,不要带 /r 参数,否则会失去 DelFileByLog 的意义)
RMDir "$SMPROGRAMS\$ICONS_GROUP"
SectionEnd
#-- 根据 NSIS 脚本编辑规则,所有 Function 区段必须放置在 Section 区段之后编写,以避免安装程序出现未可预知的问题。--#
; 以下是卸载程序通过安装日志卸载文件的专用函数,请不要随意修改
Function un.DelFileByLog
Exch $R0
Push $R1
Push $R2
Push $R3
FileOpen $R0 $R0 r
${Do}
FileRead $R0 $R1
${IfThen} $R1 == `` ${|} ${ExitDo} ${|}
StrCpy $R1 $R1 -2
StrCpy $R2 $R1 11
StrCpy $R3 $R1 20
${If} $R2 == "File: wrote"
${OrIf} $R2 == "File: skipp"
${OrIf} $R3 == "CreateShortCut: out:"
${OrIf} $R3 == "created uninstaller:"
Push $R1
Push `"`
Call un.DelFileByLog.StrLoc
Pop $R2
${If} $R2 != ""
IntOp $R2 $R2 + 1
StrCpy $R3 $R1 "" $R2
Push $R3
Push `"`
Call un.DelFileByLog.StrLoc
Pop $R2
${If} $R2 != ""
StrCpy $R3 $R3 $R2
Delete /REBOOTOK $R3
${EndIf}
${EndIf}
${EndIf}
StrCpy $R2 $R1 7
${If} $R2 == "Rename:"
Push $R1
Push "->"
Call un.DelFileByLog.StrLoc
Pop $R2
${If} $R2 != ""
IntOp $R2 $R2 + 2
StrCpy $R3 $R1 "" $R2
Delete /REBOOTOK $R3
${EndIf}
${EndIf}
${Loop}
FileClose $R0
Pop $R3
Pop $R2
Pop $R1
Pop $R0
FunctionEnd
Function un.DelFileByLog.StrLoc
Exch $R0
Exch
Exch $R1
Push $R2
Push $R3
Push $R4
Push $R5
StrLen $R2 $R0
StrLen $R3 $R1
StrCpy $R4 0
${Do}
StrCpy $R5 $R1 $R2 $R4
${If} $R5 == $R0
${OrIf} $R4 = $R3
${ExitDo}
${EndIf}
IntOp $R4 $R4 + 1
${Loop}
${If} $R4 = $R3
StrCpy $R0 ""
${Else}
StrCpy $R0 $R4
${EndIf}
Pop $R5
Pop $R4
Pop $R3
Pop $R2
Pop $R1
Exch $R0
FunctionEnd
按照上面的方法,就可以编译脚本了。
NSIS就是这么麻烦。生成的install.log没有经过任何的加密,用记事本就完全可以看到做了什么东西。
【注意!】上面的是一个非常简易的方法,生成的log保存在$INSTDIR\install.log文件中,该文件的名字不能改!
如果你想把log保存到其它文件,必需自己从http://nsis.sourceforge.net/Development_Files
下载NSIS的源代码,然后修改、重新编译! 具体操作就留给你自己去想了。
for /f "tokens=1,2,* " %%i in ('REG QUERY "HKEY_LOCAL_MACHINE\SOFTWARE\360Safe" ^| find /i "KillList"') do set "QQPath=%%k"
echo %QQPath% \xxx
1、同样数量的数据,越到后面存入缓存中的速度越慢,比如第一个十万的数据和第十个十万的数据放入缓存中速度差别达数量级。overflow和persistent都为true。
2、短时间看,shuntdown后重新加载缓存,内存冲高由100多M直接冲到151M,而缓存一直存在的方式,内存维持在109M。需要确认垃圾回收执行后,内存的变化状态。
- 大小: 33.3 KB
分享到:
相关推荐
请注意,直接修改NSIS的核心文件可能会导致不兼容或其他问题,因此在应用这类补丁时,最好先备份原有的NSIS安装文件。同时,确保你从可信的来源获取并应用补丁,以避免引入潜在的安全风险。 总之,NSIS的日志功能...
它的LOG文件是NSIS脚本在运行过程中生成的日志文件,通常用于调试和诊断安装过程中的问题。以下是关于NSIS LOG文件的详细知识点: 1. **NSIS基本概念**:NSIS是一款强大的安装制作工具,它允许开发者通过编写脚本来...
标题提到的"NSIS_2.46 带日志安全删除功能"意味着这个版本的NSIS集成了一个特殊的功能,即在安装过程中记录日志,并提供了安全删除安装文件的选项。 日志功能是NSIS中的一个重要特性,它允许开发者和用户在安装过程...
NSISdl Smooth-- NSISdl plug-in的修改版本,增加了安装过程的平滑风格显示.与NSISdl的功能没有其他差别 NSISpcre plug-in-- Nsis 正则表达式使用的插件 Name2ip plugin--把主机名转换成IP 地址。 NsProcess plugin--...
把安装详细信息导出到文件 如何读取 REG_MULTI_SZ 值 附录 E: 常用头文件 文件函数头文件 介绍 Locate GetSize DriveSpace GetDrives GetTime GetFileAttributes GetFileVersion GetExeName GetExePath...