2011-11-28 11 views
6

staram się mieć następujący kod zMając InstallDir ciągu IF ELSE bloku

; The default installation directory 
InstallDir $PROGRAMFILES\${PRODUCT_NAME} 

do

!include x64.nsh 
${If} ${RunningX64} 
    ; The default installation directory 
    InstallDir $PROGRAMFILES\${PRODUCT_NAME} 
${Else} 
    ; The default installation directory 
    InstallDir $PROGRAMFILES64\${PRODUCT_NAME} 
${EndIf} 

pojawia się następujący błąd: -

!insertmacro: _If 
Error: Can't add entry, no section or function is open! 
Error in macro _RunningX64 on macroline 2 
Error in macro _If on macroline 9 
Error in script "C:\Users\yccheok\Desktop\mysoftware.nsi" on line 17 -- aborting creation process 

Czy istnieje sposób I można ustawić wartość dla InstallDir, w ramach bloku else?

Odpowiedz

9

Jeśli potrzebujesz dynamicznego $ INSTDIR nie należy używać InstallDir w ogóle, ale ustawić $ INSTDIR w .onInit:

Installdir "" 
!include LogicLib.nsh 
!include x64.nsh 

Function .onInit 
${If} $InstDir == "" ; /D= was not used on the command line 
    ${If} ${RunningX64} 
     StrCpy $InstDir "c:\foo" 
    ${Else} 
     StrCpy $InstDir "c:\bar" 
    ${EndIf} 
${EndIf} 
FunctionEnd 

swoją aktualną jeśli inny blok nie ma żadnego sensu, ponieważ jesteś wybranie 32 bit pliki programów na x64 i 64-bitowe pliki programów na x86! Można używać $ PROGRAMFILES64 na x86, więc jeśli zawsze chcesz "prawdziwe" pliki programu, możesz użyć $ PROGRAMFILES64 dla wszystkich platform ...

+1

"$ PROGRAMFILES64 dla wszystkich platform" -> jest to całkiem miła podpowiedź. Nawiasem mówiąc, "/ D = nie był używany w wierszu poleceń" obsługa przypadku jest ważna, ponieważ moi użytkownicy przez większość czasu będą tylko dwukrotnie klikać na instalatorze. –

+1

@YanChengCHEOK Nie jest to ważne, ale/D zastąpi InstallDir, więc pozostawanie w zgodności nie boli;) – Anders

+1

Dzięki! Problem ze mną polegał na tym, że próbowałem to zrobić na zewnątrz '.onInit'. – thameera