NSIS代码if-else进行堆栈操作

时间:2015-04-14 14:43:49

标签: nsis

当涉及到nsis堆栈操作时,我总是感到困惑。现在我正在编写一小段代码来修剪字符串中的尾随空格。

  

输入:

     
    

C:\ Program Files(x86)\ COMPANY \或C:\ Program Files(x86)\ COMPANY

  
     

输出:

     
    

C:\ Program Files(x86)\ COMPANY

  

工作代码 - 使用正常的if-else

!define TrimPath '!insertmacro "_TrimPath"'
!macro _TrimPath _FOLDERPATH

    StrCpy $0 `${_FOLDERPATH}` 1 -1
    ${If} $0 == "\"
        StrCpy $1 `${_FOLDERPATH}` -1
        StrCpy `${_FOLDERPATH}` $1
    ${EndIf}

!macroend

错误的代码 - 使用堆栈操作

!define TrimPath '!insertmacro "_TrimPath"'
!macro _TrimPath _FOLDERPATH

    Exch $0

    StrCpy $2 $0 1 -1
    StrCmp $2 "\" +2 +1
        StrCpy $1 $0 -1
    StrCpy $1 $0

    Pop $0
    Exch $1

!macroend

任何人都可以纠正我并指出我的错误吗?

1 个答案:

答案 0 :(得分:1)

我认为您正在尝试将宏用作功能。一些意见/问题/提示:

  • 为什么使用Exch来交换堆栈顶部的值而不是使用_FOLDERPATH
  • 您是否在调用宏之前在堆栈中推送参数?类似的东西:
  

推送$ path

     

$ {Trimpath}

  • Pop $0恢复$ 0的值,但是你调用Exch $ 1,它将使用$ 1交换堆栈顶部的值(未知值,可能是堆栈为空)。为什么??如果要将结果保存在堆栈中,只需push $1