You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NSIS卸载时$APPDATA指向错误目录的原因及修复咨询

NSIS卸载时$APPDATA指向ProgramData而非用户目录的原因及修复方案

问题原因

NSIS中,当卸载程序以管理员权限运行时(比如安装脚本设置了RequestExecutionLevel admin,卸载程序默认继承这个权限级别),系统会将$APPDATA环境变量映射到系统级的C:\ProgramData目录,而非当前登录用户的C:\Users\{user}\AppData\Roaming。而安装过程中,即便安装程序以管理员权限运行,$APPDATA仍会指向发起安装操作的用户的个人目录,这就导致了安装和卸载时路径不一致的问题。

修复方案

方案1:通过系统函数获取当前用户的APPDATA路径

在卸载脚本中,不要直接使用$APPDATA,而是调用NSIS的GetShellFolder函数获取当前用户的Roaming目录:

Section "Uninstall" SecUninstaller
    LogSet on

    ; 定义变量存储用户APPDATA路径
    Var UserAppData
    ; 获取当前用户的AppData\Roaming目录
    GetShellFolder $UserAppData CSIDL_APPDATA

    LogText "Deleting $UserAppData\MyDir\MyFile.txt"
    Delete "$UserAppData\MyDir\MyFile.txt"

    ...
SectionEnd

CSIDL_APPDATA是系统定义的常量,专门指向当前用户的AppData\Roaming目录,不受权限提升影响。

方案2:安装时记录用户路径到注册表,卸载时读取

安装阶段,将用户的$APPDATA路径写入注册表,卸载时从注册表读取该路径:

安装脚本添加:

Section "Installer Section" SecInstaller
    LogSet on

    ...

    ; 将用户APPDATA路径写入注册表
    WriteRegStr HKCU "Software\MyApp" "UserAppData" "$APPDATA"

    ...
    LogText "Installation complete."
SectionEnd

卸载脚本修改:

Section "Uninstall" SecUninstaller
    LogSet on

    ; 从注册表读取用户APPDATA路径
    Var UserAppData
    ReadRegStr $UserAppData HKCU "Software\MyApp" "UserAppData"

    LogText "Deleting $UserAppData\MyDir\MyFile.txt"
    Delete "$UserAppData\MyDir\MyFile.txt"

    ; 卸载完成后删除注册表项
    DeleteRegKey HKCU "Software\MyApp"

    ...
SectionEnd

这种方法能确保卸载时使用的路径和安装时完全一致,适合需要精准匹配安装路径的场景。

内容的提问来源于stack exchange,提问作者Paulo Santos

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 11:31:11