使用变量时如何解决“ CreateDirectory:不支持相对路径”?

时间:2019-06-01 07:47:09

标签: nsis

作为一个新手,我仍处于试验和构建小型原型的阶段。想法是构建一个静默安装程序,该程序在.INI的多个部分中具有所有设置,并且用户使用参数/config={NameOfSection}调用安装程序。 我目前的情况:

FooBar-install.ini

[PROD]
FOOHOME=c:\FooBar

FooBar.nsi

!include FileFunc.nsh
!include LogicLib.nsh

!insertmacro GetParameters
!insertmacro GetOptions 

var /GLOBAL config
var /GLOBAL cmdLineParams
var /global REGAPPKEY
var /global FOOHOME

!define TheName "FooBar"
!define OutFileSuffix "-Install."
!define IniFile "$EXEDIR\${TheName}${OutFileSuffix}ini"

Name "${TheName} ${PRODUCT_VERSION}"     ; bei 2 Kunden geht's auch kd-spezifisch ;)
OutFile ${TheName}${OutFileSuffix}exe

RequestExecutionLevel admin
Icon "${NSISDIR}\Contrib\Graphics\Icons\modern-install.ico"
UninstallIcon "${NSISDIR}\Contrib\Graphics\Icons\modern-uninstall.ico"


Section "-aInstaller Section"


ReadINIStr $FOOHOME ${IniFile} $config "FOOHOME"
MessageBox MB_OK "ini=${IniFile} , config=$config, FOOHOME=$FOOHOME"
CreateDirectory "SFOOHOME"


SectionEnd


function .onInit
UserInfo::GetAccountType
pop $0
${If} $0 != "admin" ;Require admin rights on NT4+
    MessageBox mb_iconstop "Administrator rights required!"
    SetErrorLevel 740 ;ERROR_ELEVATION_REQUIRED
${Else}    
MessageBox  MB_OK "onInit"
${EndIf}
    ; Get parameters
${GetParameters} $cmdLineParams

    ; /? param (help)
ClearErrors

${GetOptions} $cmdLineParams '/?' $R0

IfErrors +3 0
MessageBox MB_OK "Befehlszeilenparameter /config={{name}} verweist auf einen Abschnitt aus ${TheName}${OutFileSuffix}ini mit div. Parametern zur Steuerung des Setup"
Abort


Call parseParameters
Pop $R0






FunctionEnd


Function parseParameters
    ; /config
${GetOptions} $cmdLineParams '/config=' $R0
${If} ${Errors}
StrCpy $config "errPROD"
${Else}
StrCpy $config $R0 
${Endif}
FunctionEnd

问题

如果我尝试对此进行编译,则会得到味精

CreateDirectory: Relative paths not supported
Usage: CreateDirectory directory_name

问题

  1. 我不明白为什么在编译时会出现此错误。使用变量时(尤其是在这种情况下变量取决于用户输入的情况下),抱怨未知的参数似乎没有任何意义。

  2. 我该如何避免这种情况?

  3. 让我感到困惑的一个小难题是引用变量的语法。语句MessageBox MB_OK "ini=${IniFile} , config=$config, FOOHOME=$FOOHOME"显示了这一点。我发现我需要将IniFile括在{}中以显示其值(我注释掉了CreateDir行以编译安装程序并检查我的假设)。我什么时候必须使用{}

  4. 如果您在我的小脚本中看到任何其他“不寻常的”东西,我很高兴知道;)

1 个答案:

答案 0 :(得分:1)

您有错字,请将[x for x in ...]更改为CreateDirectory "SFOOHOME"

您可能想再次阅读本文档以学习基础知识; CreateDirectory "$FOOHOME"${define}$(langstring)