我有一个需要添加到安装程序的目录结构。我有3个不同版本的安装脚本,其中一个是升级脚本,需要在安装目录中排除某个文件和子目录。 所以我做了以下几点:
File /r /x ${InputDir}\data\someFile.xml /x ${InputDir}\data\derbydb\runtime\*.* ${InputDir}\*.*
xml文件和derbydb目录已经存在(因为这是一次升级),因此我不想覆盖它们。然而,在运行安装程序时,我清楚地看到两个文件都被覆盖,而且使用7zip查看生成的setup.exe也表明它们已被添加。人们可能刚刚打电话
File /r ${InputDir}\*.*
那么这里出了什么问题?我希望NSIS有更好的文档或列出警告 他们的命令参数/语法。 (/咆哮)
答案 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 SetOverwrite,4.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
仍将作为第一个操作的一部分进行复制。