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
答案 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不允许在“评论”中设置代码格式,如果有人在搜索这些或类似问题中的任何一个(如我所做的那样),我将提供评论:
我在编译时定义项上使用了{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