设为首页 |收藏本站 |切换到宽版
 找回密码

NSIS中文论坛

查看: 104|回复: 2
收起左侧

[求助] 有偿求助大佬帮忙解决个问题

[复制链接]
  • TA的每日心情
    慵懒
    2020-9-11 10:12
  • 签到天数: 7 天

    [LV.3]偶尔看看II

    1

    主题

    2

    帖子

    124

    积分

    积分
    124
    发表于 2020-8-18 16:01:43 | 显示全部楼层 |阅读模式
    救救孩子,一个nsis相关的问题,卸载时我想保留指定文件夹不卸载,怎么实现呢?好心的大佬帮帮孩子吧,折腾不出来。(qq:844259022;vx:18728194847)
    回复

    使用道具 举报

  • TA的每日心情

    2020-8-29 13:28
  • 签到天数: 150 天

    [LV.7]常住居民III

    29

    主题

    194

    帖子

    1万

    积分

    积分
    13911
    发表于 2020-8-29 13:29:57 | 显示全部楼层
    不写删除那个文件夹的脚本不就可以了吗
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2020-9-11 10:12
  • 签到天数: 7 天

    [LV.3]偶尔看看II

    1

    主题

    2

    帖子

    124

    积分

    积分
    124
     楼主| 发表于 2020-8-31 08:56:17 | 显示全部楼层
    mefcl 发表于 2020-8-29 13:29
    不写删除那个文件夹的脚本不就可以了吗

    我也想这样,但客户想要一个自动化一点的。我在网上找了 这个方法,但是不知道怎么定义path,以及在卸载区段里怎么编写代码:


    ;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
    ;
    ;调用,在卸载字段插入宏
    ;
    !insertmacro RmDirsButSome $INSTDIR userItemlib userImage "other" "other" "other"

    注意:
    1. Function un.RmDirsButSome 这个函数是以un.funcname的方式命名的,因为函数是在卸载区段调用,只能是 un.开关;
    2.找不到不定参数的宏,没能实现保留任意多个文件或者文件夹,如有需要可以对脚本进行修改;
    3.实现参考了官方wiki的实现
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    Archiver|手机版|小黑屋|联系我们|鲁ICP备12005273号 |  

    © 2015-2020 nsisfans.com.   All Rights Reserved.

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