Stris在NSIS中的行为。我们可以比较""与其他字符串?

时间:2015-03-27 10:48:59

标签: nsis

我们可以在NSIS中将零字符串(“”)和非零字符串(例如“foo”)与StrCmp进行比较吗?

当我使用NSIS安装程序更新应用程序时,我想删除以前安装的发行版本的链接。此外,我想在卸载应用程序时删除链接。为了避免代码重复,我编写了下一个宏:

!macro Delete_Links un
        MessageBox MB_OK "Previous version is: $PVN and p1 is: ${un}"
        StrCmp ${un} "un." 0 +2 
            StrCpy $PVN ${VERSION_INFO}
        Delete "$SMPROGRAMS\${APP_NAME}\${APP_NAME} $PVN.lnk"
        ; ...
!macroend

这里$ PVN是变量,包含先前安装的发行版本号(作为字符串),$ {VERSION_INFO}是当前发行版本号(也是字符串)。

代码正常工作,如果我用非零参数un调用它,例如,我可以在卸载程序部分中调用宏:

!insertmacro Delete_Links ".un"

在安装程序部分中:

!insertmacro Delete_Links ".in"

但是如果我传递给宏零字符串

!insertmacro Delete_Links ""

宏中的StrCmp不会使相对跳跃+2到

Delete "$SMPROGRAMS\${APP_NAME}\${APP_NAME} $PVN.lnk"

并执行下一条指令

StrCmp ${un} "un." 0 +2

这不是预期的行为。

但我已经检查过,($ {un} ==“”)和(“”!=“。un”)。这段代码出了什么问题?

1 个答案:

答案 0 :(得分:1)

!insertmacro将使用引号,所以当参数是""实际上你最终会在宏中执行StrCmp "un." 0 +2和" un。"绝不等于" 0"!

使用时需要引用宏参数:StrCmp "${un}" "un." 0 +2