NSIS根據安裝文件log 卸載文件(防止誤刪)

版權聲明:本文爲博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/u012896330/article/details/54949024

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
這期間或許會遇到該問題。
Section: "-LogSetOn"
錯誤: 已指定 LogSet , 但未定義 NSIS_CONFIG_LOG .
是這樣的提示,請問怎麼解決呢?

代碼是用HM VNISEdit 腳本編輯器嚮導產生
代碼裏都有:
!include "LogicLib.nsh"
; 激活安裝日誌記錄,該日誌文件將會作爲卸載文件的依據(注意,本區段必須放置在所有區段之前)
Section "-LogSetOn"
LogSet on
SectionEnd
最佳答案
根據你的 NSIS 版本下載開啓安裝 log 的文件覆蓋你原來的 NSIS 文件夾中同名文件:
http://sourceforge.net/projects/nsis/files/
比如 NSIS 2.46,就下載 nsis-2.46-log.zip 覆蓋你 NSIS 中同名文件。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章