NSIS 中 StrCmp 的行为。我们可以将 "" 与其他字符串进行比较吗?
Behavior of StrCmp in NSIS. Can we compare "" with other strings?
我们能否将零字符串 ("") 和非零字符串(例如 "foo")与 NSIS 中的 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")。这段代码有什么问题?
!insertmacro 会吃掉引号,所以当参数为 "" 时,您实际上最终会在宏中执行 StrCmp "un." 0 +2
,而 "un." 永远不会等于 "0"!
使用时需要引用宏参数:StrCmp "${un}" "un." 0 +2
我们能否将零字符串 ("") 和非零字符串(例如 "foo")与 NSIS 中的 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")。这段代码有什么问题?
!insertmacro 会吃掉引号,所以当参数为 "" 时,您实际上最终会在宏中执行 StrCmp "un." 0 +2
,而 "un." 永远不会等于 "0"!
使用时需要引用宏参数:StrCmp "${un}" "un." 0 +2