Directory NSIS-文件/x不';t排除声明的文件/目录

Directory NSIS-文件/x不';t排除声明的文件/目录,directory,nsis,Directory,Nsis,我有一个目录结构,需要添加到安装程序。我有3个不同版本的安装脚本,其中一个是升级脚本,需要排除安装目录中的某个文件和子目录。 因此,我做了以下工作: File /r /x ${InputDir}\data\someFile.xml /x ${InputDir}\data\derbydb\runtime\*.* ${InputDir}\*.* xml文件和derbydb目录已经存在(因为这是一个升级),因此我不想覆盖它们。然而,在运行安装程序时,我清楚地看到这两个文件都被覆盖了,而且用7zip

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

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

File /r ${InputDir}\*.*
那么这里出了什么问题?我希望NSIS能有更好的文档或列出警告
它们的命令参数/语法。(/rant)

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

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

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

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

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

我发现

File /x "${DIRECTORY}Foo.img" "${DIRECTORY}*.img"
编译时不排除Foo.img-它包含在其他.img文件中。

NSIS手册()部分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开关,将同时搜索匹配的目录和文件

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

在我看来,似乎存在一个错误,如果您这样做:

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

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

在拔出我的一些头发后,终于破解了它

首先从
*.*.

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"

我已经试过了,但没用。它仍然在安装程序中包含xml文件,并覆盖已经存在的内容,但问题是,即使在编译时也不会排除它们。如果我打开生成的安装文件,我可以看到它包含我想要排除的文件。@Rex:嗯,文档似乎没有明确说明目录路径支持
/x
,因为它们支持
/r
。。。它说:
/x file |通配符
,但它甚至对文件都不起作用,不管你是使用通配符还是提供确切的路径。@Rex:问题是别的,因为我在自己的安装程序中使用了
/x
,例如
file/nonfatal/r/x.svn/x*.pl“${InstSrcFiles}\excel”
(在本例中.svn是文件夹,*.pl是文件)。你确定
${InputDir}
是正确的吗?我想是的,因为它能够正确地处理${InputDir}*。我也尝试过在/x中不指定输入目录,即只使用data\file.xml或data*.xml,但都不起作用。希望我能将此标记为答案,但此后我再也没有在NSIS上工作过,因此无法确认。