Как исправить «CreateDirectory: относительные пути не поддерживаются» при использовании переменной? - PullRequest
0 голосов
/ 01 июня 2019

Будучи новичком, я все еще на стадии экспериментов и создания маленьких прототипов.Идея состоит в том, чтобы создать установщик без вывода сообщений, который имеет все настройки в нескольких разделах .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 Ответ

1 голос
/ 01 июня 2019

У вас есть опечатка, измените CreateDirectory "SFOOHOME" на CreateDirectory "$FOOHOME"

Возможно, вы захотите прочитать документацию еще раз, чтобы изучить основы; ${define}, $(langstring) и $variable.

...