Передайте переменную в функцию File для цикла цикла в NSIS - PullRequest
0 голосов
/ 27 сентября 2018

Моя проблема заключается в следующем: я не могу передать переменную внутри цикла for, похоже, она не распознает переменную.Он принимает строку с переменной, но не значение переменной.Это мой код

!define FORMAT "XY 2018|XY 2019"

!include "LogicLib.nsh"
!include "Explode.nsh"

# set the name of the installer
Outfile "example.exe"

# create a default section.
Section

${Explode}  $0  "|" "${FORMAT}"
${For} $1 1 $0
    Pop $2
    !define PATH_OK "Z:\XY\Doc\List\*$2*"
    File "${PATH_OK}"
${Next}

SectionEnd

Когда я собираюсь скомпилировать файл nsis, он возвращает эту ошибку:

!define: "PATH_OK"="Z:\XY\Doc\List\*$2*"
File: "Z:\XY\Doc\List\*$2*" -> no files found.
Usage: File [/nonfatal] [/a] ([/r] [/x filespec [...]] filespec [...] |
/oname=outfile one_file_only)
Error in script "C:\Users\Francesco\Desktop\example.nsi" on line 19 aborting creation process

Я не могу понять, почему ... если я пытаюсьизменить код Файл "$ {PATH_OK}" с окном сообщения, путь к ок.Где я делаю не так?Большое спасибо всем!

Ответы [ 3 ]

0 голосов
/ 28 сентября 2018

!define - это команда времени компиляции, в то время как переменные определяются и оцениваются во время выполнения.

Из документации :

Команды утилиты компилятора

Эти команды аналогичны препроцессору C по назначению и функциональности.Они допускают включение файлов, условную компиляцию, упаковку исполняемых заголовков и выполнение процесса во время процесса сборки. Примечание. Ни одна из этих команд не позволяет использовать переменные.

Кроме того, в отличие от определений, переменные не работают с командой File.

0 голосов
/ 28 сентября 2018

Вы не можете смешивать и сочетать инструкции времени компиляции и выполнения!Вы также должны узнать разницу между ${define} и $variable.

Все инструкции, начинающиеся с !, обрабатываются препроцессором .С другой стороны, ${For} запускается на компьютере конечного пользователя, и это слишком поздно для File для добавления файлов в ваш установщик.

File поддерживает только базовые символы DOS (* и?):

Section
SetOutPath $InstDir
File "c:\mysourcefiles\XY 201?.txt"
SectionEnd

Если вам нужно что-то более продвинутое, вы должны использовать макрос или внешнюю вспомогательную программу, выполняемую с !system.

!define FORMAT "XY 2018.txt|XY 2019.txt"

!macro ExplodeAndIncludeFile string sep
!searchparse /noerrors "${string}" "" ExplodeAndIncludeFile_Temp "${sep}"
!ifdef ExplodeAndIncludeFile_Temp
    File "${ExplodeAndIncludeFile_Temp}"
    !undef ExplodeAndIncludeFile_Temp
    !searchparse /noerrors "${string}" "${sep}" ExplodeAndIncludeFile_Temp
    !ifdef ExplodeAndIncludeFile_Temp
        !insertmacro ${__MACRO__} "${ExplodeAndIncludeFile_Temp}" "${sep}" ; Macro recursion only supported in NSIS 3+
    !endif
!endif
!macroend

Section
SetOutPath $InstDir
!insertmacro ExplodeAndIncludeFile "${FORMAT}" "|"
SectionEnd
0 голосов
/ 27 сентября 2018

Вы используете недопустимый символ (*) в имени файла.

Ссылка: Именование файлов, путей и пространств имен

...