如何在NSIS安装脚本中不使用goto/label语句捕获YESNOCANCEL MessageBox的结果?

5
我想了解如何在NSIS安装程序脚本中,使用LogicLib.nsh中的IF逻辑与YESNOCANCEL MessageBox结合使用,以避免使用标签和goto语句。
有没有办法将MessageBox的结果捕获到某种变量中?
此外,我知道还有比NSIS更好的东西,但目前无法使用其他工具。=(
请注意下面代码中的{WHAT GOES HERE??}。如果这只是一个If...Else...,那就没问题了。
感谢您的帮助。
${If} ${Cmd} `MessageBox MB_YESNOCANCEL|MB_ICONEXCLAMATION 
"PROGRAM X is already installed. Click YES to remove the installed version 
 found in C:\Program Files(x86). Click NO to skip uninstall and choose a 
 different install location (not recommended) or CANCEL to terminate
  the installer." IDYES`

    MessageBox MB_OK "Yes was clicked"
${ElseIf} {WHAT GOES HERE??}
    MessageBox MB_OK "No was clicked"
${Else}    
    MessageBox MB_OK "Cancel was clicked"
${EndIf}  

更新:我还发现了这个例子,但是我不确定${||}是什么以及它如何帮助我。

  ; ifcmd..||..| and if/unless cmd
  StrCpy $R2 ""
  ${IfCmd} MessageBox MB_YESNO "Please click Yes" IDYES ${||} StrCpy $R2 $R2A ${|}
  ${Unless} ${Cmd} `MessageBox MB_YESNO|MB_DEFBUTTON2 "Please click No" IDYES`
    StrCpy $R2 $R2B
  ${EndUnless}
  ${If} $R2 == "AB"
    DetailPrint "PASSED IfCmd/If Cmd test"
  ${Else}
    DetailPrint "FAILED IfCmd/If Cmd test"
  ${EndIf}  

+1 好问题。顺便问一下,你知道如何正常使用标签与消息框吗?你知道这是可能的,而且也许是你唯一的选择? - gideon
是的!如果有可能,那就是我想要避免的。 - Brandon
您可以编辑/更新问题。删除您的评论,单击问题上的“编辑”并在其中添加代码。 - gideon
这里有一些NSIS的人,希望你能在某个时候得到答案 =P - gideon
太好了,我祈祷成功。 - Brandon
1个回答

8

${|} 结尾的语句表示一个 if 块,如果条件为真,则执行单个指令:

${IfThen} $Instdir == $Temp ${|} MessageBox mb_ok "$$InstDir equals $$Temp" ${|}

这只是一种简写语法,实际上等同于:

${If} $Instdir == $Temp 
    MessageBox mb_ok "$$InstDir equals $$Temp" 
${EndIf}

IfCmd宏在内部使用${IfThen} ${Cmd}${||}是一个用于结束IfCmd启动的字符串引号的hack,因此:

${IfCmd} MessageBox MB_YESNO "click yes" IDYES ${||} MessageBox mb_ok choice=IDYES ${|}

是“的速记形式:

${If} ${Cmd} 'MessageBox MB_YESNO "yes" IDYES' ;notice the quotes here
    MessageBox mb_ok choice=IDYES
${EndIf}

您甚至可以混合使用ifthen和标签,但我认为这很丑陋:

StrCpy $0 "Cancel"
${IfCmd} MessageBox MB_YESNOCANCEL "Mr. Powers?" IDYES yes IDNO ${||} StrCpy $0 "NO?!" ${|}
MessageBox mb_iconstop $0 ;Cancel or NO
goto end
yes:
MessageBox mb_ok "Yeah baby yeah!"
end:

(对于YESNOCANCEL和ABORTRETRYIGNORE,请使用带有MessageBox的标签;对于YESNO、OKCANCEL等需要执行不同代码的选项,请使用${If} ${Cmd} 'MessageBox ..' .. ${Else} .. ${EndIf}语法。)


...不过,你不能将结果捕获到变量中,但是你可以编写一个!宏包装器来为你完成这个操作的MessageBox... - Anders

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接