NSIS - File / x не исключает файлы / каталоги, как заявлено - PullRequest
7 голосов
/ 27 января 2012

У меня есть структура каталогов, которую нужно добавить в установщик. У меня есть 3 разные версии моего скрипта установки, и одна из них, являющаяся скриптом обновления, требует исключения определенного файла и подкаталога в моем каталоге установки. Поэтому я делаю следующее:

File /r  /x ${InputDir}\data\someFile.xml /x ${InputDir}\data\derbydb\runtime\*.* ${InputDir}\*.*

Файл xml и каталог derbydb уже присутствуют (поскольку это обновление), и поэтому я не хочу их перезаписывать. Тем не менее, при запуске установщика я ясно вижу, что оба файла перезаписаны, и, кроме того, просмотр сгенерированного setup.exe с 7zip показывает, что они также были добавлены. Можно было бы просто позвонить

File /r ${InputDir}\*.*

Так что здесь не так? Я хотел бы, чтобы у NSIS была лучшая документация или список предупреждений с их командные параметры / синтаксис. (/ Напыщенная)

Ответы [ 7 ]

7 голосов
/ 30 апреля 2013

Руководство NSIS (http://nsis.sourceforge.net/Docs/Chapter4.html) раздел 4.9.1.5 Файл содержит следующее:

Используйте ключ / x для исключения файлов или каталогов.

Я пытался использовать разные варианты, но работал только один:

SetOutPath $INSTDIR
File /r /x Config ..\MyProgram\*.*

где "Config" - это каталог "MyProgram \ Plugins \ Config". NSIS выполняет поиск только по имени, и будет неправильно задавать любые подпапки (например, «/ x Plugins \ Config» или «/ x $ INSTDIR \ MyProgram \ Plugins \ Config \»). Существует один недостаток: если у вас одни и те же папки в разных каталогах, с помощью ключа / r будет выполняться поиск как в соответствующих каталогах, так и в файлах.

3 голосов
/ 07 августа 2012

Я считаю, что

File /x "${DIRECTORY}Foo.img" "${DIRECTORY}*.img"

НЕ исключает Foo.img во время компиляции - он включен в другие файлы .img.

2 голосов
/ 27 февраля 2019

Наконец взломал его после того, как выдернул некоторые мои волосы ...

Сначала исключите весь подкаталог из *.*

File /r /x "subfolder" "C:\App\bin\*.*"

, затем измените выходной каталог на свойвложенная папка ...

SetOutPath "$INSTDIR\subfolder"

, затем исключите XML-файлы ...

File /r /x "*.xml" "C:\App\bin\subfolder\*.*"

, а затем установите путь вывода обратно, как это было ...

SetOutPath "$INSTDIR"

так что это должно выглядеть примерно так ...

SetOutPath "$INSTDIR"
File /r /x "subfolder" "C:\App\bin\*.*"
SetOutPath "$INSTDIR\subfolder"
File /r /x "*.xml" "C:\App\bin\subfolder\*.*"
SetOutPath "$INSTDIR"
2 голосов
/ 30 января 2012

/x предназначен для исключения некоторых файлов, которые будут включены в установщик во время компиляции .

Если я правильно понимаю, вы хотите избежать перезаписи файлов во время установки / обновления во время выполнения .

Таким образом, вы можете использовать флаг компилятора SetOverwrite перед директивой File. Посмотрите на раздел руководства 4.8.2.8 SetOverwrite , раздел 4.8.2 также показывает метод для обработки SetOverwrite динамически.

1 голос
/ 05 января 2017

Мне кажется, есть ошибка, которая заключается в том, что если вы сделаете:

File /r "C:\folder a\subfolder b"
File /r /x "subfolder b" "C:\folder b"

, то C:\folder b\subfolder a\subfolder b все равно будет скопировано как часть первой операции.

1 голос
/ 12 сентября 2014
var pname
!define pname "Salt v1.2.9.3c"
File /r /x small-games.info.url "E:\Games\${pname}\*.*"

включает E: \ Games \ $ {pname} *. *, но исключает small-games.info.url в папках

1 голос
/ 27 января 2012

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

File /r  /x data\someFile.xml /x data\derbydb\runtime\*.* ${InputDir}\*.*
...