Installation 如何在NSIS安装程序脚本中捕获没有gotos/标签的YESNOCANCEL MessageBox的结果?

Installation 如何在NSIS安装程序脚本中捕获没有gotos/标签的YESNOCANCEL MessageBox的结果?,installation,windows-installer,nsis,messagebox,Installation,Windows Installer,Nsis,Messagebox,我想知道如何在NSIS安装程序脚本中将YESNOCANCEL消息框与LogicLib.nsh中的IF逻辑结合使用,以避免使用标签和GOTO 有没有办法在某种变量中捕获MessageBox的结果 此外,我知道有比NSI更好的东西,但在这一点上使用其他东西是不可能的=( 注意下面代码中的{WHAT go HERE???}。如果这只是一个If…Else…就可以了 谢谢你的帮助 ${If} ${Cmd} `MessageBox MB_YESNOCANCEL|MB_ICONEXCLAMATION "PR

我想知道如何在NSIS安装程序脚本中将YESNOCANCEL消息框与LogicLib.nsh中的IF逻辑结合使用,以避免使用标签和GOTO

有没有办法在某种变量中捕获MessageBox的结果

此外,我知道有比NSI更好的东西,但在这一点上使用其他东西是不可能的=(

注意下面代码中的
{WHAT go 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}  

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

${IfThen} $Instdir == $Temp ${|} MessageBox mb_ok "$$InstDir equals $$Temp" ${|}
这只是以下内容的简写语法:

${If} $Instdir == $Temp 
    MessageBox mb_ok "$$InstDir equals $$Temp" 
${EndIf}
IfCmd宏在内部使用
${IfThen}${Cmd}
,而
${| |}
是结束IfCmd启动的字符串引号的一种方法,因此:

${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}
您甚至可以将iFeth和标签混合使用,但这很难看:

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,对于YESNO和OKCANCEL等,最好只使用带有MessageBox的标签。对于这两个选项执行不同的代码,请使用${If}${Cmd}'MessageBox..${Else}..${EndIf}语法)

+1问得好。顺便说一句,你知道通常如何在MessageBox中使用标签吗?你知道这是可能的,而且这可能是你唯一的选择?是的!这就是我试图避免的,如果可能的话。你可以编辑/更新你的问题。删除你的评论,单击你的问题上的
编辑
,然后在其中添加你的代码。有一个这里很少有NSIS的人,你可能会在某个时候得到答案=P@giddy很好,我正在交叉手指…不,您不能在变量中捕获结果,但是您可以为MessageBox编写一个!宏包装器来为您完成此操作。。。