NSIS脚本中FileRead使用变量触发编译语法错误求助
解决NSIS宏中动态变量赋值的语法错误问题
首先,咱们来拆解你遇到的语法错误核心原因:
你在宏里用$${addonVar}试图动态引用变量,但NSIS的预处理器(负责处理!macro和!insertmacro的部分)是编译时执行的,而你传入的$5是运行时变量——预处理器根本没法提前知道$5的具体值,导致$${addonVar}被错误展开成$$5(也就是字符串$5),而非你期望的目标变量名(比如$foo),这直接引发了语法报错。
解决方案:用运行时间接变量赋值实现动态逻辑
咱们需要放弃预编译时的变量展开思路,改用NSIS的运行时间接变量操作来完成动态赋值。这里推荐用LogicLib库中的${SetVar}宏(需要先引入库),能轻松实现动态变量赋值。
步骤1:引入LogicLib库
在脚本最开头添加这行,确保能使用${SetVar}宏:
!include "LogicLib.nsh"
步骤2:修改DESC_READ宏
调整宏的逻辑,先把文件内容读到临时变量,再通过${SetVar}动态赋值给目标变量:
!macro DESC_READ addonText lang targetVarName FileOpen $6 "$TEMP\addonInstallerPreFolder\5.1\${addonText}_${lang}.txt" r ${if} ${addonText} == proFile FileRead $6 $proFileDesc ${else} ${if} ${addonText} == "ExtensionsFrame" FileRead $6 $extensions ${else} ; 先把文件内容读到临时变量$0 FileRead $6 $0 ; 动态将$0的内容赋值给`targetVarName`对应的变量 ${SetVar} "${targetVarName}" $0 ${endIf} ${endIf} FileClose $6 !macroend
步骤3:修复ReadAllDesc函数的潜在问题
另外注意到你函数里的SectionGetText $h $4,$h没有定义,应该替换为循环变量$j(毕竟你是在遍历节索引):
Function ReadAllDesc Var /global j ${foreach} $j 0 $secCount + 1 ; 修正:用循环变量$j作为节索引 SectionGetText $j $4 ${StrContains} $5 "++" $4 ${ifnot} $5 == "" StrCpy $5 $4 "" 2 ${else} StrCpy $5 $4 ${endif} !insertmacro DESC_READ $4 $lang $5 ${next} FunctionEnd
为什么这样能解决问题?
${SetVar}是运行时执行的宏,它接收变量名的字符串(也就是$5存储的内容,比如foo),然后把指定值赋值给对应的变量(比如$foo),完美适配你动态读取不同描述的需求,彻底避开了预处理器和运行时变量的冲突。
内容的提问来源于stack exchange,提问作者Cris Night
相关产品推荐
相关产品推荐

