如何转义“${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
我将 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