【问题标题】:Having InstallDir within IF ELSE block在 IF ELSE 块中有 InstallDir
【发布时间】:2011-11-28 10:01:11
【问题描述】:

我尝试从

获得以下代码
; The default installation directory
InstallDir $PROGRAMFILES\${PRODUCT_NAME}

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

我收到以下错误:-

!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

我可以在 if else 块内设置InstallDir 的值吗?

【问题讨论】:

    标签: nsis


    【解决方案1】:

    如果您需要动态的 $InstDir,则根本不应该使用 InstallDir,而应在 .onInit 中设置 $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
    

    您当前的 if else 块没有任何意义,因为您选择的是 x64 上的 32 位程序文件和 x86 上的 64 位程序文件!在 x86 上使用 $PROGRAMFILES64 是可以的,所以如果你总是想要“真正的”程序文件,你可以在所有平台上使用 $PROGRAMFILES64...

    【讨论】:

    • "$PROGRAMFILES64 for all platforms" -> 这是一个非常好的提示。顺便说一句,“/D= 未在命令行上使用”处理案例很重要,因为我的用户大部分时间只会双击安装程序。
    • @YanChengCHEOK 不,这并不重要,但 /D 将覆盖 InstallDir,因此保持兼容不会受到伤害;)
    • 谢谢!我的问题是我试图在.onInit之外这样做。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多