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

时间:2012-01-27 09:23:13

标签: directory nsis

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

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

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

File /r ${InputDir}\*.*

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

7 个答案:

答案 0 :(得分: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开关,将搜索匹配的目录和文件。

答案 1 :(得分:3)

我找到了

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

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

答案 2 :(得分:2)

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

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

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

答案 3 :(得分: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"

答案 4 :(得分:1)

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

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

答案 5 :(得分: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

答案 6 :(得分:1)

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

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

然后C:\folder b\subfolder a\subfolder b仍将作为第一个操作的一部分进行复制。