NSIS 代码 if-else 到堆栈操作

NSIS code if-else to stack operation

说到nsis的栈操作,我总是一头雾水。现在我正在编写一小段代码来修剪字符串中的尾随 space。

Input:

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

输出:

C:\Program Files (x86)\COMPANY

工作代码 - 正常 if-else

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

    StrCpy [=10=] `${_FOLDERPATH}` 1 -1
    ${If} [=10=] == "\"
        StrCpy  `${_FOLDERPATH}` -1
        StrCpy `${_FOLDERPATH}` 
    ${EndIf}
    
!macroend

错误代码 - 堆栈操作

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

    Exch [=11=]
    
    StrCpy  [=11=] 1 -1
    StrCmp  "\" +2 +1
        StrCpy  [=11=] -1
    StrCpy  [=11=]
    
    Pop [=11=]
    Exch 

!macroend

任何人都可以纠正我并指出我哪里错了吗?

我认为您正在尝试将宏用作函数。一些 comments/questions/hints:

  • 为什么要使用 Exch 来交换堆栈顶部的值,而不是使用 _FOLDERPATH
  • 在调用宏之前是否将参数压入堆栈?类似于:

push $path

${Trimpath}

  • Pop [=12=] 恢复 $0 的值,但随后您调用 Exch $1,它会将堆栈顶部的值(未知值,可能堆栈为空)与 $1 交换。为什么??如果要将结果存入栈中,只需push .