NSIS - File / x不排除声明的文件/目录

问题描述 投票:7回答:7

我有一个需要添加到安装程序的目录结构。我有3个不同版本的安装脚本,其中一个是升级脚本,需要在安装目录中排除某个文件和子目录。所以我做了以下事情:

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

xml文件和derbydb目录已经存在(因为这是一个升级),因此我不想覆盖它们。然而,在运行安装程序时,我清楚地看到两个文件都被覆盖,而且使用7zip查看生成的setup.exe也表明它们已被添加。人们可能刚刚打过电话

File /r ${InputDir}\*.*

那么这里出了什么问题?我希望NSIS能够获得更好的文档或列出其命令参数/语法的警告。 (/咆哮)

directory nsis
7个回答
7
投票

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
投票

我发现

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

在编译时不排除Foo.img - 它包含在其他.img文件中。


2
投票

/x用于排除在编译时包含在安装程序中的某些文件。

如果我理解正确,您希望避免在运行时安装/升级期间覆盖文件。

因此,您可以在SetOverwrite指令之前使用File编译器标志。查看手册部分4.8.2.8 SetOverwrite4.8.2部分还显示了动态处理SetOverwrite的方法。


2
投票

最后把我的一些头发拉出来后把它弄碎了......

首先从*.*中排除整个子目录

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"

1
投票

我认为问题是您不应该指定文件的完整路径以仅排除模式,因此换句话说,命令应如下所示:

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

1
投票
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
投票

在我看来,有一个错误,如果你这样做:

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

然后C:\folder b\subfolder a\subfolder b仍然会被复制作为第一次操作的一部分。

© www.soinside.com 2019 - 2024. All rights reserved.