Windows 11下NSIS安装程序EstimatedSize不显示问题求助
关于NSIS安装程序在Windows 11“已安装应用”显示大小的问题
问题1:Windows 11是否不再支持旧方法?
Windows 11并未完全废弃EstimatedSize注册表项,但读取逻辑有调整:
- 系统优先读取MSI安装包的原生大小数据,对NSIS这类非MSI安装程序,
EstimatedSize的优先级有所降低 - 若注册表路径错误(比如64位系统下写入了32位分支)、权限不足,或者系统缓存未刷新,都会导致该值无法被读取显示
问题2:NSIS下无需切换MSI的解决方案
1. 修正注册表路径(适配64位系统)
Win11多为64位环境,需确保写入的注册表项在正确分支,可通过SetRegView切换视图:
!include "LogicLib.nsh" !include "FileFunc.nsh" !insertmacro GetSize RequestExecutionLevel admin ; 切换到64位注册表视图 SetRegView 64 ${GetSize} "$INSTDIR" "/S=0K" $0 $1 $2 IntFmt $0 "0x%08X" $0 WriteRegDword HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\MyApp" "EstimatedSize" $0 ; 兼容32位系统,切换回32位视图写入对应分支 SetRegView 32 WriteRegDword HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\MyApp" "EstimatedSize" $0
2. 精确计算大小(排除指定子文件夹)
要排除某个子文件夹(例如$INSTDIR\TempFiles),需分别计算主目录和目标子目录的大小,再做差值运算:
; 计算主目录总大小(含所有子文件夹) ${GetSize} "$INSTDIR" "/S=0K" $total $1 $2 ; 计算需排除的子文件夹大小 ${GetSize} "$INSTDIR\TempFiles" "/S=0K" $exclude $3 $4 ; 得出最终要写入的大小(单位为KB) IntOp $final_size $total - $exclude ; 转换为十六进制DWORD格式 IntFmt $final_size "0x%08X" $final_size ; 写入注册表 WriteRegDword HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\MyApp" "EstimatedSize" $final_size
3. 触发系统刷新,更新已安装应用列表
写入注册表后,调用Windows API通知系统卸载信息变更,强制刷新显示:
!include "WinCore.nsh" ; 在注册表写入完成后添加以下代码 System::Call 'shell32.dll::SHChangeNotify(i 0x08000000, i 0, i 0, i 0)'
额外注意事项
- 确保
RequestExecutionLevel admin生效,否则可能没有写入HKLM注册表的权限 - 卸载项的
DisplayName等必填字段需正确配置,否则系统可能不识别该卸载条目 - 若仍不显示,可尝试重启资源管理器或等待系统自动刷新(Win11有时会延迟读取注册表变更)
内容的提问来源于stack exchange,提问作者Valeria
相关产品推荐
相关产品推荐

