杉宫竹苑工作室

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

调用卸载日志进行安全卸载

[复制链接]
发表于 2019-3-1 21:57:49 | 显示全部楼层 |阅读模式

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

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

x
1、在普通安装脚本前添加库

  1. !include "LogicLib.nsh"
复制代码

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

3、
  1. /******************************
  2. * 以下是安装程序的卸载部分 *
  3. ******************************/
  4. ; 根据安装日志卸载文件的调用宏
  5. !macro DelFileByLog LogFile
  6. ifFileExists `${LogFile}` 0 +4
  7. Push `${LogFile}`
  8. Call un.DelFileByLog
  9. Delete `${LogFile}`
  10. !macroend
  11. Section Uninstall
  12. !insertmacro MUI_STARTMENU_GETFOLDER "Application" $ICONS_GROUP
  13. Delete "$INSTDIR${PRODUCT_NAME}.url"
  14. ; 调用宏只根据安装日志卸载安装程序自己安装过的文件
  15. !insertmacro DelFileByLog "$INSTDIRinstall.log"
  16. ; 清除安装程序创建的且在卸载时可能为空的子目录,对于递归添加的文件目录,请由最内层的子目录开始清除(注意,不要带 /r 参数,否则会失去 DelFileByLog 的意义)
  17. RMDir "$SMPROGRAMS$ICONS_GROUP"
  18. SectionEnd
  19. #-- 根据 NSIS 脚本编辑规则,所有 Function 区段必须放置在 Section 区段之后编写,以避免安装程序出现未可预知的问题。--#
  20. ; 以下是卸载程序通过安装日志卸载文件的专用函数,请不要随意修改
  21. Function un.DelFileByLog
  22. Exch $R0
  23. Push $R1
  24. Push $R2
  25. Push $R3
  26. FileOpen $R0 $R0 r
  27. ${Do}
  28. FileRead $R0 $R1
  29. ${IfThen} $R1 == `` ${|} ${ExitDo} ${|}
  30. StrCpy $R1 $R1 -2
  31. StrCpy $R2 $R1 11
  32. StrCpy $R3 $R1 20
  33. ${If} $R2 == "File: wrote"
  34. ${OrIf} $R2 == "File: skipp"
  35. ${OrIf} $R3 == "CreateShortCut: out:"
  36. ${OrIf} $R3 == "created uninstaller:"
  37. Push $R1
  38. Push `"`
  39. Call un.DelFileByLog.StrLoc
  40. Pop $R2
  41. ${If} $R2 != ""
  42. IntOp $R2 $R2 + 1
  43. StrCpy $R3 $R1 "" $R2
  44. Push $R3
  45. Push `"`
  46. Call un.DelFileByLog.StrLoc
  47. Pop $R2
  48. ${If} $R2 != ""
  49. StrCpy $R3 $R3 $R2
  50. Delete /REBOOTOK $R3
  51. ${EndIf}
  52. ${EndIf}
  53. ${EndIf}
  54. StrCpy $R2 $R1 7
  55. ${If} $R2 == "Rename:"
  56. Push $R1
  57. Push "->"
  58. Call un.DelFileByLog.StrLoc
  59. Pop $R2
  60. ${If} $R2 != ""
  61. IntOp $R2 $R2 + 2
  62. StrCpy $R3 $R1 "" $R2
  63. Delete /REBOOTOK $R3
  64. ${EndIf}
  65. ${EndIf}
  66. ${Loop}
  67. FileClose $R0
  68. Pop $R3
  69. Pop $R2
  70. Pop $R1
  71. Pop $R0
  72. FunctionEnd
  73. Function un.DelFileByLog.StrLoc
  74. Exch $R0
  75. Exch
  76. Exch $R1
  77. Push $R2
  78. Push $R3
  79. Push $R4
  80. Push $R5
  81. StrLen $R2 $R0
  82. StrLen $R3 $R1
  83. StrCpy $R4 0
  84. ${Do}
  85. StrCpy $R5 $R1 $R2 $R4
  86. ${If} $R5 == $R0
  87. ${OrIf} $R4 = $R3
  88. ${ExitDo}
  89. ${EndIf}
  90. IntOp $R4 $R4 + 1
  91. ${Loop}
  92. ${If} $R4 = $R3
  93. StrCpy $R0 ""
  94. ${Else}
  95. StrCpy $R0 $R4
  96. ${EndIf}
  97. Pop $R5
  98. Pop $R4
  99. Pop $R3
  100. Pop $R2
  101. Pop $R1
  102. Exch $R0
  103. FunctionEnd
复制代码


回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-18 02:32 , Processed in 0.106410 second(s), 18 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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