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

NSIS技术问询:如何通过INI文件在运行时设置VIProductVersion

NSIS中VIProductVersion与INI版本读取的问题解答

我来帮你逐个拆解这些问题:

1. 是否只能使用!define定义的值,无法使用普通变量?

没错,VIProductVersion是NSIS编译时指令,它在脚本编译阶段就需要确定最终值,而普通变量(比如$varVersion)是安装程序运行时才会被赋值的。编译阶段根本无法预知运行时变量的内容,所以确实只能用!define定义的预编译宏来给VIProductVersion赋值。

2. 若无法使用普通变量,能否将ini文件中指定条目的值存储到!define中?

直接用NSIS内置的ReadINIStr是不行的,因为它是运行时命令。但我们可以借助预处理器+外部工具的组合实现编译时读取INI指定条目并定义宏:
核心思路是用外部命令行工具(比如PowerShell)提取INI里的目标值,写入临时文件,再用!define /file读取这个临时文件的内容作为宏的值。

给你个具体的实现示例:

; 用PowerShell提取INI中Version段的VersionNumber值,写入临时文件
!execute 'powershell -Command "$ini = @{}; Get-Content \"C:\Users\a\Downloads\Info.ini\" | ForEach-Object { if ($_ -match '^\[(.+)\]$') { $section = $matches[1]; $ini[$section] = @{} } elseif ($_ -match '^(.+?)=(.+)$') { $ini[$section][$matches[1]] = $matches[2].Trim() } }; Write-Output $ini['Version']['VersionNumber']" > version.tmp'

; 从临时文件读取值并定义宏
!define /file varVersion version.tmp

; 可以删除临时文件(可选)
!delfile version.tmp

; 现在就可以给VIProductVersion用这个宏了
VIProductVersion ${varVersion}

3. 已知可通过!define /file命令读取文件内容,但我仅需读取ini文件中的指定条目值。

这就对应上面的方案:先用外部工具把INI中你需要的那个条目值单独提取出来,保存成一个只有目标值的临时文件,再用!define /file读取这个临时文件。这样就相当于只把指定条目的值导入成了预编译宏,完美匹配你的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 06:41:12