NSIS中系统特殊路径变量基础知识(修正)
侧边栏壁纸
  • 累计撰写 29 篇文章
  • 累计收到 178 条评论

NSIS中系统特殊路径变量基础知识(修正)

nsisfans
2022-01-27 / 9 评论 / 291 阅读 / 正在检测是否收录...

作者:贾可

在多年交流 NSIS 技术中,发现很多用户对 Windows 系统特殊文件夹路径方面的知识点还比较欠缺。大多用户只了解几个常用路径,比如 $INSTDIR、$WINDOWS、$DESKTOP、$SMPROGRAMS 等文件夹,对于其他不常用的路径就无从所知了,通常会采用截取和拼接字符串的方式来实现。殊不知,这样的方式根本不能通用,带来的影响是轻则在未来的 Windows 版本中微软可能对目录结构进行调整而导致路径不再适用,重则更换主机甚至更换用户就无效。实际上,很多常见的文件夹路径都是可以通过专用的方式来获取。Windows API 中有一个函数 SHGetFolderPath 可用以获取这些特殊路径。在很多编程语言或脚本中,也都能获取到或通过它们提供的变量或特殊字符串来引用这些路径,NSIS 中同样支持这些路径常量,具体可以参考 NSIS 用户手册的(NSIS.chm)的 4.2.3 章节。此 API 可以获取到的这些路径大多是"当前用户"和"公共用户"(所有用户)配置路径中的子目录,无法获取其他用户的路径。针对当前用户和公共用户这两个不同的环境,大多编程语言或脚本中通常以不同的前缀来区分。比如当前用户通常使用 user 前缀或没有前缀,而公共用户通常使用 common 前缀。但 NSIS 中则没有如此便利的方式,而是需要通过 SetShellVarContext 这个命令来控制获取哪个用户环境的路径。对于如何在 NSIS 中获取这些路径,通常会遇到两类用户。比如下面这两种情况:

Windows XP 时代,我曾遇到某安装包在 Vista 系统上创建 C:Documents and SettingsAll UsersApplication Data 这个路径,7z 解包得到伪代码[NSIS.nsi],得知其做法是截取 $WINDIR 的前三个字符,再暴力拼接 Documents and SettingsAll UsersApplication Data 字符串这样的笨办法。此类用户对 NSIS 的脚本还是有一定了解,但对于少部分不常用的路径还是不知道如何获取,不知道在 NSIS 中同样有相应的方法可以直接获取该路径。在 NSIS 中,此路径需要配合 SetShellVarContext 命令才能正确获取。

又或者是有人提出这样的问题:如何获取当前用户名?详细了解后才知道,他想安装到 C:Users<Username>AppDataLocal 这个路径。如果不深入了解,根本不知道此用户其实是想获取一个文件夹路径,但他的问题很难与最终目的建立起联系。此用户试图将某些路径,比如 C:Users<Username>AppDataLocal 中的用户名部分进行替换来达成目的。在 Windows 10 之前,重装系统时如果不格式化原系统分区,直接进行覆盖安装,那么即使新的用户名也叫 <Username>,但是相关的文件夹路径中用户名的会变成"<Username>.随机字符串"。如果系统版本是 5.x,则目录结构都不一样,暴力拼接根本不可能拿到正确路径。部分用户最初并不知道这类路径是可以直接获取,导致提出的问题与实际的目的有很大偏差。在 NSIS 中,用 $LOCALAPPDATA 变量即可解决问题。

即使 NSIS 中不提供对应变量的路径,我们也应该适用相对合理的拼接方式。比如先确认是否可以通过 Vista 之后系统提供的新 API SHGetKnownFolderPath 来获取,如果可行,则使用本文末尾提供的方法来获取。例如文章末尾提到的 AppData 下面的 LocalLow 文件夹。另外,也可以使用 ReadEnvStr 来读取环境变量来获取少部分 NSIS 不提供的路径。比如获取系统分区所在驱动器,读取 SYSTEMDRIVE 显然比截取 $WINDIR 前缀更好。

基于以上情况,特此编写此文档,罗列绝大多数常用的系统文件夹在 NSIS 中对应的变量名和参考路径,以及对应的 SetShellVarContext 参数设置。

部分内容截图:

NSIS中系统特殊路径变量基础知识

完整文档下载:

0

评论 (9)

取消
  1. 头像
    lwz
    Windows 7 · Google Chrome

    这个很好啊,感谢分享~

    回复
  2. 头像
    aaaa
    MacOS · Safari

    学习学习

    回复
  3. 头像
    fxy
    Windows 10 · FireFox

    和是和GV存储过程也吃了

    回复
  4. 头像
    博士
    Windows 10 · Google Chrome

    看看有没有帮助

    回复
  5. 头像
    agh
    Android · Google Chrome

    来学习一下

    回复
  6. 头像
    伟大的兔神
    Windows 10 · Google Chrome

    很棒!

    回复
  7. 头像
    yongber
    Windows 10 · Google Chrome

    谢谢你,很有用

    回复
  8. 头像
    lcnabian
    Windows 10 · Google Chrome

    学习学习

    回复
  9. 头像
    ZZZZ
    Windows 10 · Google Chrome

    1111

    回复