2016-03-04 30 views
1

NSIS让我疯狂,我无法做一些非常简单的事情。跟if语句的字符串比较无效。有人能告诉我我做错了什么吗?我的字符串comparaison与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脚本

编辑 正如安德斯建议,我试过(学)使用变量,而不是定义之前:

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} 

Unfortunaly,不起作用。见踪迹:

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 
+0

您将PRODUCT_NAME定义为什么? – Anders

+0

@Anders PRODUCT_NAME = sdk在这种情况下 – peterphonic

+0

你确定你没有混合定义和变量吗? – Anders

回答

0

你的代码是有点怪,定义(${something})设置在编译时,你可以在编译时通过!if比较。如果在最终用户机器上运行时确定安装64位的东西,则必须使用变量($something)。虽然在你的例子中使用${If}语句中的定义是完全合法的,但我不会推荐它,因为它添加了永远不会执行的代码。

!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 “somethingthatmakestheifstatementfalse” “DEMO_NOT_FOR_RETAIL” 等于=,不相等的= _LogicLib_ElseLabel_1

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