Как мне зафиксировать результаты YESNOCANCEL MessageBox без gotos / label в сценариях установщика NSIS?

Я хотел бы знать, как использовать YESNOCANCEL MessageBox в сочетании с логикой IF из LogicLib.nsh в сценариях установщика NSIS, чтобы избежать использования меток и gotos.

Есть ли способ зафиксировать результат MessageBox в какой-либо переменной?

Кроме того, я знаю, что есть вещи получше, чем NSIS, но на данный момент невозможно использовать что-то еще. знак равно

Обратите внимание на {WHAT GOES HERE??} в приведенном ниже коде. Если бы это было просто «Если ... Иначе ...», все сработало бы нормально.

Спасибо за помощь

${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}  

person Brandon    schedule 26.03.2011    source источник
comment
+1 Хороший вопрос. Кстати, а вы умеете нормально использовать ярлык с MessageBox? Вы знаете, что это возможно, и это, может быть, ваш единственный вариант?   -  person gideon    schedule 26.03.2011
comment
Ага! Это то, чего я стараюсь избегать, если это вообще возможно.   -  person Brandon    schedule 26.03.2011
comment
вы можете просто отредактировать / обновить свой вопрос. Удалите свой комментарий, нажмите edit на свой вопрос и добавьте туда свой код.   -  person gideon    schedule 26.03.2011
comment
здесь есть несколько людей из NSIS. Надеюсь, вы получите ответ когда-нибудь = P   -  person gideon    schedule 26.03.2011
comment
@giddy Отлично, скрещиваю пальцы.   -  person Brandon    schedule 26.03.2011


Ответы (1)


Строка, оканчивающаяся на ${|}, указывает блок 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}

Можно даже смешивать 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:

(Лучше просто использовать метки с MessageBox для YESNOCANCEL и ABORTRETRYIGNORE, для YESNO, OKCANCEL и т. Д., Которые выполняют другой код для обоих вариантов, используйте $ {If} $ {Cmd} 'MessageBox ..' .. $ {Else} .. $ {EndIf} синтаксис)

person Anders    schedule 27.03.2011
comment
... и нет, вы не можете записать результат в переменную, но вы можете написать макрос-оболочку! для MessageBox, которая сделает это за вас ... - person Anders; 27.03.2011