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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 12:30:05