2016-12-12 6 views
1

내가 나중에 같은 설치 프로그램에 포함 할 임시 파일에 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 

그래서 어떻게 든 이스케이프해야합니다.

달러 기호를 이스케이프 및/또는 다음과 같이 괄호가 작동하지 않습니다

!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}"을 (를) 이스케이프 처리하는 방법은 무엇입니까?

+0

$ {VARIABLE}은 (는) 변수가 아니며 정의입니다! – Anders

+0

@ 앵더 : 물론! 문제와 관련이 없지만 수정 됨. – bassim

답변

0

나는이 (약간 더 읽기) 솔루션 결국 : 당신은 달러와 붙어있는 V2 NSIS에서

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

당신이 발견 해킹. 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 
+0

언제나 그렇듯이, 가치있는 기여 인 @Anders! 예, 이것에 대해 생각했지만 AFAIU는 유니 코드 설치 프로그램에서만 작동합니다. 그렇지 않습니까? – bassim

+1

아니요, ASCII 범위의 문자가 어디에서나 작동해야합니다. ANSI 설치 관리자를 작성할 때 올바른 코드 페이지로 변환하려고 시도하지만 변환이 차선책이거나 실패 할 수 있습니다. – Anders