Как мне записать результаты MessageBox YESNOCANCEL без gotos / label в сценариях установщика NSIS? - PullRequest
3 голосов
/ 26 марта 2011

Я хотел бы знать, как использовать MessageBox YESNOCANCEL в сочетании с логикой IF из LogicLib.nsh в сценариях установщика NSIS, чтобы избежать необходимости использовать метки и переходы.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 Ответ

7 голосов
/ 27 марта 2011

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

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})

...