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
相关产品推荐
相关产品推荐

