NSIS脚本中使用Pop获取控件变量失败问题求助
NSIS脚本Pop语句编译失败问题排查
问题描述
我尝试在NSIS脚本中将创建的控件存储到变量中,但执行Pop语句时编译失败——Pop $Dialog能正常运行,Pop $checkbox却报错。相关脚本片段如下:
nsDialogs::Create 1018 Pop $Dialog ${If} $Dialog == error Abort ${EndIf} ${NSD_CreateLabel} 0 10u 100% 12u "There is a new feature available in this version called Fuse." ${NSD_CreateLabel} 0 22u 100% 12u "It makes your whole Mega Cloud Drive being available directly from Windows Explorer." ${NSD_CreateLabel} 0 34u 100% 12u "In order to use it, you need to install WinFSP. Do you want to install WinFSP?" ${NSD_CreateCheckbox} 30u 70u 100% 12u "Install WinFSP" Pop $checkbox ;${If} $Checkbox_State == ${BST_CHECKED} ; ${NSD_Check} $Checkbox ;${EndIf} Var /GLOBAL installWinFSP StrCpy $installWinFSP "Y" nsDialogs::Show
编译时的错误信息:
warning: !warning: LangString "MULTIUSER_INNERTEXT_INSTALLMODE_ALLUSERS" for language Welsh is missing, using fallback from "C:\Program Files (x86)\NSIS\Contrib\Language files\English.nsh" (macro:LANGFILE_SETSTRING:7) warning: !warning: LangString "MULTIUSER_INNERTEXT_INSTALLMODE_CURRENTUSER" for language Welsh is missing, using fallback from "C:\Program Files (x86)\NSIS\Contrib\Language files\English.nsh" (macro:LANGFILE_SETSTRING:7) warning 6000: unknown variable/constant "installWinFSP" detected, ignoring (macro:_==:1) Usage: Pop $(user_var: output) Error in script "installer_win.nsi" on line 311 -- aborting creation process
问题原因
- 自定义变量未提前声明:NSIS规定,除了
$0-$9这类内置临时变量外,所有自定义变量必须先通过Var声明才能使用。你直接使用$checkbox但未提前声明,导致编译时无法识别这个变量,触发Pop`的用法错误。 - 变量声明位置错误:
Var /GLOBAL installWinFSP被放在了对话框创建的执行代码流程中,而NSIS要求所有Var声明必须放在脚本的全局代码段(函数、Section之外的最外层),这也是出现unknown variable/constant "installWinFSP"警告的原因。
解决方法
- 在脚本全局区域提前声明所需的自定义变量;
- 调整
Var声明的位置,确保其处于脚本最外层。
修改后的示例脚本:
; 全局区域声明所有自定义变量 Var checkbox Var /GLOBAL installWinFSP nsDialogs::Create 1018 Pop $Dialog ${If} $Dialog == error Abort ${EndIf} ${NSD_CreateLabel} 0 10u 100% 12u "此版本新增一项名为Fuse的功能。" ${NSD_CreateLabel} 0 22u 100% 12u "它可让你的整个Mega云盘直接在Windows资源管理器中访问。" ${NSD_CreateLabel} 0 34u 100% 12u "要使用该功能,需安装WinFSP。是否要安装WinFSP?" ${NSD_CreateCheckbox} 30u 70u 100% 12u "安装WinFSP" Pop $checkbox ; ${If} $Checkbox_State == ${BST_CHECKED} ; ${NSD_Check} $Checkbox ; ${EndIf} StrCpy $installWinFSP "Y" nsDialogs::Show
额外说明
- 如果不想自定义变量,也可以直接使用NSIS内置的临时变量(如
$0)接收控件句柄,例如Pop $0,后续用$0操作控件即可; - 全局变量的声明必须放在脚本最外层,不能嵌入到执行代码流程中,否则会被NSIS判定为未定义变量。
内容的提问来源于stack exchange,提问作者Mickaël C. Guimarães
相关产品推荐
相关产品推荐

