如何转义“${variable}”

How to escape "${variable}"

我将 NSIS 代码附加到一个临时文件,以便稍后包含在同一个安装程序中:

...
!tempfile includeInSectionA
...
!appendfile '${includeInSectionA}' '<some NSIS code>$\n'
...
Section "A" SEC_A
    !include '${includeInSectionA}'
SectionEnd
...

我想附加到临时文件的一些 NSIS 代码包含变量(或定义,同样的问题),如 ${variable}:

Var variable
StrCpy ${variable} 'contentOfVariable'  
...
!appendfile '${includeInSectionA}' 'DetailPrint "Variable: ${variable}"$\n'

问题:变量应该在包含临时文件时扩展,而不是在将其附加到临时文件时扩展,因为其内容在此期间会发生变化:

!appendfile '${includeInSectionA}' 'DetailPrint "Variable: ${variable}"$\n'
; --> DetailPrint "Variable: contentOfVariable"  ; WRONG
; --> DetailPrint "Variable: ${variable}"        ; RIGHT

因此必须以某种方式对其进行转义。

转义美元符号 and/or 如下方括号不起作用:

!appendfile '${includeInSectionA}' 'DetailPrint "Variable: $${variable}"$\n'
; --> DetailPrint "Variable: $contentOfVariable"

!appendfile '${includeInSectionA}' 'DetailPrint "Variable: $\{variable}"$\n'
; --> DetailPrint "Variable: $\{variable}"

!appendfile '${includeInSectionA}' 'DetailPrint "Variable: $${variable}"$\n'
; --> DetailPrint "Variable: $\contentOfVariable"

一个解决方案是像这样分解变量,但那样...丑陋、容易分解且难以维护:

!appendfile '${includeInSectionA}' 'DetailPrint "Variable: $'
!appendfile '${includeInSectionA}' '{variable}"$\n'

那么,如何转义“${variable}”?

我最终得到了这个(稍微更易读)的解决方案:

!define DOLLAR '$'
...
!appendfile '${includeInSectionA}' 'DetailPrint "Variable: ${DOLLAR}{variable}"$\n'
; --> DetailPrint "Variable: ${variable}"
...

在 NSIS v2 中,您遇到了发现的 DOLLAR hack。在 NSIS v3 中,您可以直接插入字符代码:

Var foo
Var bar
!define VAR_FOO foo
!define VAR_BAR bar

Section
!define DOLLAR "$"
!tempfile testinc
!appendfile "${testinc}" 'DetailPrint "${DOLLAR}{VAR_FOO}"$\n'
!appendfile "${testinc}" 'DetailPrint "${U+24}{VAR_BAR}"$\n'
!include "${testinc}"
!delfile "${testinc}"
SectionEnd