2016-12-12 3 views
1

J'annexant le code NSIS à un fichier temporaire pour inclure plus tard dans le même installateur:

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

Une partie du code NSIS Je veux ajouter au fichier temporaire contient variables (ou définit, même problème) comme ${variable}:

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

le problème: la variable doit développer au moment de l'inclusion de fichier temporaire, pas au moment de l'ajout au fichier temporaire, parce que son contenu sera changé entre-temps:

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

Il doit donc être échappé d'une manière ou d'une autre.

Échapper le signe du dollar et/ou les crochets comme suit ne fonctionne pas:

!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" 

Une solution serait de briser la variable comme celui-ci est, mais qui est ... laid, facile à briser et difficile à maintenir:

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

Alors, comment faire pour échapper "$ {variable}"?

+0

$ {VARIABLE} n'est pas une variable, c'est une définition! – Anders

+0

@Anders: Bien sûr! Corrigé, bien que non pertinent par rapport au problème. – bassim

Répondre

0

J'ai fini avec ce (un peu plus lisible) solution:

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

Dans NSIS v2 vous êtes coincé avec le DOLLAR pirater que vous avez trouvé. Dans NSIS v3, vous pouvez insérer des codes de caractères directement:

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 
+0

Comme toujours, une contribution précieuse, @Anders! Oui, j'ai pensé à ça, mais AFAIU ne fonctionnerait qu'avec les installateurs Unicode, n'est-ce pas? – bassim

+1

Non, les caractères de la plage ASCII devraient fonctionner partout. Il essaie de convertir à la page de code correcte lors de l'écriture des installateurs ANSI mais la conversion peut être sous-optimale ou échouer. – Anders