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

