2011-11-28 13 views
6

मैंINSTALLDIR होने भीतर यदि किसी और ब्लॉक

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

मैं निम्न त्रुटि प्राप्त करने के लिए

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

से निम्नलिखित कोड की कोशिश: -

!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 

वहाँ जिस तरह से मैं है InstallDir के लिए मान निर्धारित कर सकते हैं, अन्यथा ब्लॉक के भीतर?

उत्तर

9

आप एक गतिशील $ InstDir की जरूरत है आप .onInit में INSTALLDIR बिल्कुल लेकिन सेट $ InstDir उपयोग नहीं करना चाहिए:

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 

आपके मौजूदा यदि किसी और ब्लॉक क्योंकि आप 32 बिट चयन कर रहे हैं किसी भी मतलब नहीं है x64 पर प्रोग्राम फ़ाइलें और x86 पर 64 बिट प्रोग्राम फ़ाइलें! X86 पर $ PROGRAMFILES64 का उपयोग करना ठीक है, इसलिए यदि आप हमेशा "वास्तविक" प्रोग्राम फ़ाइलों को चाहते हैं तो आप सभी प्लेटफ़ॉर्म के लिए $ PROGRAMFILES64 का उपयोग कर सकते हैं ...

+1

"सभी प्लेटफ़ॉर्म के लिए $ PROGRAMFILES64" -> यह एक बहुत अच्छा संकेत है। वैसे, "/ डी = कमांड लाइन पर उपयोग नहीं किया गया था" हैंडलिंग केस महत्वपूर्ण है, क्योंकि मेरे उपयोगकर्ता अधिकतर समय इंस्टॉलर पर डबल क्लिक करेंगे। –

+1

@YanChengCHEOK नहीं, यह महत्वपूर्ण नहीं है लेकिन/डी इंस्टॉलडियर को ओवरराइड करेगा ताकि संगत रहना चोट न पहुंचाए;) – Anders

+1

धन्यवाद! मेरे साथ समस्या यह थी कि मैं इसे '.onInit' के बाहर करने की कोशिश कर रहा था। – thameera

संबंधित मुद्दे