;软件的使用过程,会产生一些由用户产生的数据,而软件卸载时,用户往往不希望卸载这些文件。
;以下实现了卸载除指定文件夹,文件以外的所有文件。
;
;delete dirs except one
;
Function un.RmDirsButSome
; exclude dir
Exch $R0
Exch 1
Exch $R1
Exch 2
Exch $R2
Exch 3
Exch $R3
Exch 4
Exch $R4
; route dir
Exch 5
Exch $R5
Push $R6
Push $R7
ClearErrors
FindFirst $R7 $R6 "$R5/*.*"
IfErrors Exit
Top:
StrCmp $R6 "." Next
StrCmp $R6 ".." Next
StrCmp $R6 $R0 Next
StrCmp $R6 $R1 Next
StrCmp $R6 $R2 Next
StrCmp $R6 $R3 Next
StrCmp $R6 $R4 Next
;delete file or rm dir
IfFileExists "$R5/$R6/*.*" IsDir IsFile
IsDir:
RmDir /r "$R5/$R6"
IsFile:
IfFileExists "$R5/$R6" 0 Next
delete "$R5/$R6"
#Goto Exit ;uncomment this to stop it being recursive (delete only one dir)
Next:
ClearErrors
FindNext $R7 $R6
IfErrors Exit
Goto Top
Exit:
FindClose $R7
Pop $R7
Pop $R6
Pop $R5
Pop $R4
Pop $R3
Pop $R2
Pop $R1
Pop $R0
FunctionEnd
;
;删除除指定文件夹以外的文件宏
;delete dirs except one
;
Function un.RmDirsButSome
; exclude dir
Exch $R0
Exch 1
Exch $R1
Exch 2
Exch $R2
Exch 3
Exch $R3
Exch 4
Exch $R4
; route dir
Exch 5
Exch $R5
Push $R6
Push $R7
ClearErrors
FindFirst $R7 $R6 "$R5/*.*"
IfErrors Exit
Top:
StrCmp $R6 "." Next
StrCmp $R6 ".." Next
StrCmp $R6 $R0 Next
StrCmp $R6 $R1 Next
StrCmp $R6 $R2 Next
StrCmp $R6 $R3 Next
StrCmp $R6 $R4 Next
;delete file or rm dir
IfFileExists "$R5/$R6/*.*" IsDir IsFile
IsDir:
RmDir /r "$R5/$R6"
IsFile:
IfFileExists "$R5/$R6" 0 Next
delete "$R5/$R6"
#Goto Exit ;uncomment this to stop it being recursive (delete only one dir)
Next:
ClearErrors
FindNext $R7 $R6
IfErrors Exit
Goto Top
Exit:
FindClose $R7
Pop $R7
Pop $R6
Pop $R5
Pop $R4
Pop $R3
Pop $R2
Pop $R1
Pop $R0
FunctionEnd
;
;删除除指定文件夹以外的文件宏
;还没有找到怎么实现不定参数的宏,这个实现只能保留最多五个文件或者文件夹,如果想保留更多的文件或者文件夹可以参照实现
;
;
;path--软件的安装路径
;path1--用户指定的保留文件夹或者文件
;path2--用户指定的保留文件夹或者文件
;path3--用户指定的保留文件夹或者文件
;path4--用户指定的保留文件夹或者文件
;path5--用户指定的保留文件夹或者文件
;
!macro RmDirsButSome path path1 path2 path3 path4 path5
push ${path}
push ${path1}
push ${path2}
push ${path3}
push ${path4}
push ${path5}
call un.RmDirsButSome
!macroend
!macro RmDirsButSome path path1 path2 path3 path4 path5
push ${path}
push ${path1}
push ${path2}
push ${path3}
push ${path4}
push ${path5}
call un.RmDirsButSome
!macroend
;
;调用,在卸载字段插入宏
;
!insertmacro RmDirsButSome $INSTDIR userItemlib userImage "other" "other" "other"
注意:
1. Function un.RmDirsButSome 这个函数是以un.funcname的方式命名的,因为函数是在卸载区段调用,只能是 un.开关;
2.找不到不定参数的宏,没能实现保留任意多个文件或者文件夹,如有需要可以对脚本进行修改;
3.实现参考了官方wiki的实现