2016-03-04 77 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

我仍然無法解釋爲什麼它總是在你的最後評價爲真。