如果nsis语句,我的字符串comparaison不起作用

时间:2016-03-04 19:43:43

标签: nsis

NSIS让我发疯,我无法做一些非常简单的事情。以下与if语句的字符串比较不起作用。有人能告诉我我做错了吗?

!ifndef PRODUCT_NAME
    !define PRODUCT_NAME "$%PRODUCT_NAME%"
!endif

DetailPrint "TEST - ${PRODUCT_NAME}"
${If} ${PRODUCT_NAME} == "DEMO_NOT_FOR_RETAIL"
    DetailPrint "DEMO"
    File /r ${LOCAL_DIST_DIR_OUTPUT}\bin\win64
${Else}
    DetailPrint "NOT DEMO"
${EndIf}

无论$ {PRODUCT_NAME}的价值是什么,它都会输入if语句。 PRODUCT_NAME是我的shell脚本在调用我的nsis脚本之前设置的环境变量

修改 正如Anders所建议的,我尝试(学习)使用变量而不是define:

Var /Global PRODUCT_NAME
StrCpy $PRODUCT_NAME "$%PRODUCT_NAME%"

DetailPrint "TEST - $PRODUCT_NAME"
${If} $PRODUCT_NAME == "DEMO_NOT_FOR_RETAIL"
    DetailPrint "DEMO"
    File /r ${LOCAL_DIST_DIR_OUTPUT}\bin\win64
${Else}
    DetailPrint "NOT DEMO"
${EndIf}

不幸的是,不起作用。见痕迹:

 Var: "PRODUCT_NAME"
StrCpy $PRODUCT_NAME "sdk" () ()
DetailPrint: "TEST - $PRODUCT_NAME"
!insertmacro: _If
!insertmacro: _PushLogic
!insertmacro: _PushScope
!define: "_Logic"="_LogicLib_Label_53"
!insertmacro: end of _PushScope
!insertmacro: _IncreaseCounter
!define: "_LOGICLIB_COUNTER"="53"
!undef: "LOGICLIB_COUNTER"
!define: "LOGICLIB_COUNTER"="54"
!undef: "_LOGICLIB_COUNTER"
!insertmacro: end of _IncreaseCounter
!insertmacro: end of _PushLogic
!define: "_LogicLib_Label_53If"=""
!define: "_LogicLib_Label_53Else"="_LogicLib_Label_54"
!insertmacro: _IncreaseCounter
!define: "_LOGICLIB_COUNTER"="54"
!undef: "LOGICLIB_COUNTER"
!define: "LOGICLIB_COUNTER"="55"
!undef: "_LOGICLIB_COUNTER"
!insertmacro: end of _IncreaseCounter
!define: "_c=true"=""
!insertmacro: _==
StrCmp "$PRODUCT_NAME" "DEMO_NOT_FOR_RETAIL" equal=, nonequal=_LogicLib_Label_54

2 个答案:

答案 0 :(得分:0)

您的代码有点奇怪,定义(${something})在编译时设置,您可以在编译时将它们与!if进行比较。如果应在最终用户计算机上的运行时确定安装64位内容,则必须使用变量($something)。虽然在${If}语句中使用define是完全合法的,但我不会真正推荐它,因为它会添加永远不会执行的代码。

!include LogicLib.nsh


Section

; Using a define:
!define PRODUCT_NAME "blahblahDEMO_NOT_FOR_RETAIL"
!if "${PRODUCT_NAME}" == "DEMO_NOT_FOR_RETAIL"
    DetailPrint "DEMO"
!else
    DetailPrint "NOT DEMO"
!endif


; Using a variable:
Var /Global PRODUCT_NAME
StrCpy $PRODUCT_NAME "blahblahDEMO_NOT_FOR_RETAIL"

${If} $PRODUCT_NAME == "DEMO_NOT_FOR_RETAIL"
    DetailPrint "DEMO"
${Else}
    DetailPrint "NOT DEMO"
${EndIf}
SectionEnd

如果您想坚持当前的设计,您可以通过将LOGICLIB_VERBOSITY设置为4来实际查看生成的比较指令和编译时使用的值:

!define LOGICLIB_VERBOSITY 4
!include LogicLib.nsh

!define PRODUCT_NAME "somethingthatmakestheifstatementfalse"

Section
DetailPrint "|${PRODUCT_NAME}|"
${If} ${PRODUCT_NAME} == "DEMO_NOT_FOR_RETAIL"
    DetailPrint "DEMO"
${Else}
    DetailPrint "NOT DEMO"
${EndIf}
SectionEnd

作为编译器输出的一部分,我得到了这个:

  

StrCmp"表达错误的东西" " DEMO_NOT_FOR_RETAIL" equal =,nonequal = _LogicLib_ElseLabel_1

我仍然无法解释为什么它总是在你的最终评估为真。

答案 1 :(得分:0)

谢谢安德斯!建议将编译器时间(如果是)与安装时间(如果是)分开保存!这是一个评论,而不是答案,但是Stack Overflow不允许在“评论”中设置代码格式,如果有人在搜索这些或类似问题中的任何一个(如我所做的那样),我将提供评论:

  • “ NSIS其他声明不起作用”
  • “总是执行NSIS Else子句”

我在编译时定义项上使用了{If},但它表现得很奇怪:

{If} MY_DEFINE:
  do_this
{Else}
  do_that
{EndIf}

定义MY_DEFINE时,上面的代码将执行do_this,但也始终执行do_that!现在似乎很容易将编译时和安装时逻辑分开,但是NSIS是我很少使用的工具,我每次都必须重新学习它。根据Anders的建议,此问题已解决:

!if MY_DEFINE:
  do_this
!else
  do_that
!endif