设为首页 收藏本站

NSIS中文论坛

查看: 182|回复: 4

[求助] 如何判断当前程序是否安装在Program Files下面

[复制链接]

该用户从未签到

5

主题

7

帖子

62

积分

积分
62
发表于 2018-9-17 08:50:21 | 显示全部楼层 |阅读模式
IfFileExists吗,谁知道怎么写啊,判断后再跳转。
回复

使用道具 举报

该用户从未签到

1

主题

146

帖子

746

积分

积分
746

NSIS元老

发表于 2018-9-19 13:56:57 | 显示全部楼层
其实你上面的详细解释我从你最初的问题是看出来的。我当时说没表述清楚是指:不知道你是指覆盖安装时检测之前的安装目录,还是全新安装时对用户选择的路径进行判断。目前看来问题疑似是后者。如果是这样的话,你直接判断 $INSTDIR 的前面是不是 $PROGRAMFILES 不就行了吗?比如:

        # 只判断 32 位系统:
        # 判断路径是否完全等于 $PROGRAMFILES
        StrCmp $INSTDIR $PROGRAMFILES lb_prog_files
        # 如果不等于则取字符串开头 $PROGRAMFILES 长度数量的子字符串
        StrLen $R1 $PROGRAMFILES
        StrCpy $R2 $INSTDIR $R1
        # 比较该字符串是否等于 $PROGRAMFILES
        StrCmp $R2 $PROGRAMFILES 0 lb_other_dirs
        # 如果以 $PROGRAMFILES 开头则取下一个字符判断是否“\”字符。
        StrCpy $R2 $INSTDIR 1 $R1
        # 如果是则说明 $INSTDIR 的确是 $PROGRAMFILES 开头的路径。
        StrCmp $R2 "\" 0 lb_other_dirs
lb_prog_files:
        DetailPrint '安装路径为 "$PROGRAMFILES" 或位于 "$PROGRAMFILES\"'
        Goto lb_dir_done
lb_other_dirs:
        DetailPrint '安装路径为其他路径'
lb_dir_done:

        # 32 位和 64 位都判断:
        StrCmp $INSTDIR $PROGRAMFILES32 lb_prog_files
        StrLen $R1 $PROGRAMFILES32
        StrCpy $R2 $INSTDIR $R1
        StrCmp $R2 $PROGRAMFILES32 0 lb_other_dirs
        StrCpy $R2 $INSTDIR 1 $R1
        StrCmp $R2 "\" lb_prog_files
        StrCmp $INSTDIR $PROGRAMFILES64 lb_prog_files
        StrLen $R1 $PROGRAMFILES64
        StrCpy $R2 $INSTDIR $R1
        StrCmp $R2 $PROGRAMFILES64 0 lb_other_dirs
        StrCpy $R2 $INSTDIR 1 $R1
        StrCmp $R2 "\" 0 lb_other_dirs
lb_prog_files:
        DetailPrint '安装路径为 "$PROGRAMFILES32" 或 "$PROGRAMFILES64"'
        DetailPrint '安装路径位于 "$PROGRAMFILES32\" 或 "$PROGRAMFILES64\"'
        Goto lb_dir_done
lb_other_dirs:
        DetailPrint '安装路径为其他路径'
lb_dir_done:

为何要写入到注册表,再判断是否包含……

回复 支持 1 反对 0

使用道具 举报

该用户从未签到

1

主题

146

帖子

746

积分

积分
746

NSIS元老

发表于 2018-9-18 23:29:40 | 显示全部楼层
感觉逻辑都没表述清除,到底是要判断什么做什么。
回复 支持 反对

使用道具 举报

该用户从未签到

5

主题

7

帖子

62

积分

积分
62
 楼主| 发表于 2018-9-19 09:12:36 | 显示全部楼层
jiake 发表于 2018-9-18 23:29
感觉逻辑都没表述清除,到底是要判断什么做什么。

那我讲得仔细一点:
如果当前程序安装在系统默认程序路径下(如 C:\Program Files\XXX) ,那我执行代码1;
如果当前程序安装在非系统默认程序路径下(如D:\XXX),那我执行代码2。

所以我想判断当前程序是否安装在Program Files下面
我的想法是,先把路径写到注册表,再判断注册表中是否包含“Program Files”?
回复 支持 反对

使用道具 举报

该用户从未签到

5

主题

7

帖子

62

积分

积分
62
 楼主| 发表于 2018-9-26 15:26:31 | 显示全部楼层
jiake 发表于 2018-9-19 13:56
其实你上面的详细解释我从你最初的问题是看出来的。我当时说没表述清楚是指:不知道你是指覆盖安装时检测之 ...

非常感谢,效果实现了,不过我要消化一下,把代码弄懂
回复 支持 反对

使用道具 举报

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

本版积分规则

Archiver|手机版|小黑屋|联系我们|NSIS中文论坛    

GMT+8, 2018-12-19 04:51 , Processed in 0.024451 second(s), 16 queries , MemCache On.

Powered by Discuz!X3.3

Copyright © 2015-2018 NSIS中文论坛

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