杉宫竹苑工作室

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 2139|回复: 0

NSIS 根据安装文件log 卸载文件(防止误删)

[复制链接]
发表于 2017-12-22 17:35:14 | 显示全部楼层 |阅读模式

正式会员享受无限制浏览网站功能和高速网盘下载,赶快加入本站吧!

您需要 登录 才可以下载或查看,没有账号?立即注册

x
1、在普通安装脚本前添加库
  1. !include "LogicLib.nsh"
复制代码

2、; 激活安装日志记录,该日志文件将会作为卸载文件的依据(注意,本区段必须放置在所有区段之前)
  1. Section "-LogSetOn"
  2.   LogSet on
  3. SectionEnd
复制代码

3、
  1. /****************************** * 以下是安装程序的卸载部分 * ******************************/

  2. ; 根据安装日志卸载文件的调用宏

  3. !macro DelFileByLog LogFile
  4.   ifFileExists `${LogFile}` 0 +4
  5.     Push `${LogFile}`
  6.     Call un.DelFileByLog
  7.     Delete `${LogFile}`
  8. !macroend

  9. Section Uninstall
  10.   !insertmacro MUI_STARTMENU_GETFOLDER "Application" $ICONS_GROUP
  11.   Delete "$INSTDIR\${PRODUCT_NAME}.url"

  12. ; 调用宏只根据安装日志卸载安装程序自己安装过的文件

  13. !insertmacro DelFileByLog "$INSTDIR\install.log"

  14.   ; 清除安装程序创建的且在卸载时可能为空的子目录,对于递归添加的文件目录,请由最内层的子目录开始清除(注意,不要带 /r 参数,否则会失去 DelFileByLog 的意义)
  15. RMDir "$SMPROGRAMS\$ICONS_GROUP"
  16. SectionEnd
  17. -- 根据 NSIS 脚本编辑规则,所有 Function 区段必须放置在 Section 区段之后编写,以避免安装程序出现未可预知的问题。--

  18. ; 以下是卸载程序通过安装日志卸载文件的专用函数,请不要随意修改
  19.       Function un.DelFileByLog
  20.       Exch $R0
  21.       Push $R1
  22.       Push $R2
  23.       Push $R3
  24.       FileOpen $R0 $R0 r
  25.       ${Do}
  26.         FileRead $R0 $R1
  27.         ${IfThen} $R1 == `` ${|} ${ExitDo} ${|}
  28.         StrCpy $R1 $R1 -2
  29.         StrCpy $R2 $R1 11
  30.         StrCpy $R3 $R1 20
  31.         ${If} $R2 == "File: wrote"
  32.         ${OrIf} $R2 == "File: skipp"
  33.         ${OrIf} $R3 == "CreateShortCut: out:"
  34.         ${OrIf} $R3 == "created uninstaller:"
  35.           Push $R1
  36.           Push `"`
  37.           Call un.DelFileByLog.StrLoc
  38.           Pop $R2
  39.           ${If} $R2 != ""
  40.             IntOp $R2 $R2 + 1
  41.             StrCpy $R3 $R1 "" $R2
  42.             Push $R3
  43.             Push `"`
  44.             Call un.DelFileByLog.StrLoc
  45.             Pop $R2
  46.             ${If} $R2 != ""
  47.               StrCpy $R3 $R3 $R2
  48.               Delete /REBOOTOK $R3
  49.             ${EndIf}
  50.           ${EndIf}
  51.         ${EndIf}
  52.         StrCpy $R2 $R1 7
  53.         ${If} $R2 == "Rename:"
  54.           Push $R1
  55.           Push "->"
  56.           Call un.DelFileByLog.StrLoc
  57.           Pop $R2
  58.           ${If} $R2 != ""
  59.             IntOp $R2 $R2 + 2
  60.             StrCpy $R3 $R1 "" $R2
  61.             Delete /REBOOTOK $R3
  62.           ${EndIf}
  63.         ${EndIf}
  64.       ${Loop}
  65.       FileClose $R0
  66.       Pop $R3
  67.       Pop $R2
  68.       Pop $R1
  69.       Pop $R0
  70.     FunctionEnd

  71.     Function un.DelFileByLog.StrLoc
  72.       Exch $R0
  73.       Exch
  74.       Exch $R1
  75.       Push $R2
  76.       Push $R3
  77.       Push $R4
  78.       Push $R5
  79.       StrLen $R2 $R0
  80.       StrLen $R3 $R1
  81.       StrCpy $R4 0
  82.       ${Do}
  83.         StrCpy $R5 $R1 $R2 $R4
  84.         ${If} $R5 == $R0
  85.         ${OrIf} $R4 = $R3
  86.           ${ExitDo}
  87.         ${EndIf}
  88.         IntOp $R4 $R4 + 1
  89.       ${Loop}
  90.       ${If} $R4 = $R3
  91.         StrCpy $R0 ""
  92.       ${Else}
  93.         StrCpy $R0 $R4
  94.       ${EndIf}
  95.       Pop $R5
  96.       Pop $R4
  97.       Pop $R3
  98.       Pop $R2
  99.       Pop $R1
  100.       Exch $R0
  101.     FunctionEnd
复制代码
这期间或许会遇到该问题。
  1. Section: "-LogSetOn"
  2. 错误: 已指定 LogSet , 但未定义 NSIS_CONFIG_LOG .
  3. 是这样的提示,请问怎么解决呢?

  4. 代码是用HM VNISEdit 脚本编辑器向导产生
  5. 代码里都有:
  6. !include "LogicLib.nsh"
  7. ; 激活安装日志记录,该日志文件将会作为卸载文件的依据(注意,本区段必须放置在所有区段之前)
  8. Section "-LogSetOn"
  9.   LogSet on
  10. SectionEnd
复制代码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|手机版|Archiver|SgzyStudio

GMT+8, 2024-5-17 08:24 , Processed in 0.106772 second(s), 19 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表