2011-11-28 13 views
6

cerco di avere il seguente codice daAvendo InstallDir nel blocco IF ELSE

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

a

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

ottengo il seguente errore: -

!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 

C'è modo di può impostare il valore per InstallDir, all'interno del blocco else else?

risposta

9

Se avete bisogno di un $ InstDir dinamica non si dovrebbe usare InstallDir a tutti, ma impostare $ InstDir in .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 

Il tuo attuale se blocco il resto non ha alcun senso, perché si sta selezionando il 32 bit programma i file su x64 e i file di programma 64 bit su x86! È OK usare $ PROGRAMFILES64 su x86 quindi se vuoi sempre i file di programma "reali" puoi usare $ PROGRAMFILES64 per tutte le piattaforme ...

+1

"$ PROGRAMFILES64 per tutte le piattaforme" -> questo è un suggerimento molto carino. A proposito, è "/ D = non è stato utilizzato sulla riga di comando", poiché la gestione dei casi è importante, poiché i miei utenti la maggior parte delle volte fanno doppio clic sul programma di installazione. –

+1

@YanChengCHEOK No, non è importante ma/D sovrascrive InstallDir in modo da rimanere compatibile non danneggiando;) – Anders

+1

Grazie! Il problema con me era che stavo provando a farlo al di fuori di '.onInit'. – thameera