我有一个需要添加到安装程序的目录结构。我有3个不同版本的安装脚本,其中一个是升级脚本,需要在安装目录中排除某个文件和子目录。所以我做了以下事情:
File /r /x ${InputDir}\data\someFile.xml /x ${InputDir}\data\derbydb\runtime\*.* ${InputDir}\*.*
xml文件和derbydb目录已经存在(因为这是一个升级),因此我不想覆盖它们。然而,在运行安装程序时,我清楚地看到两个文件都被覆盖,而且使用7zip查看生成的setup.exe也表明它们已被添加。人们可能刚刚打过电话
File /r ${InputDir}\*.*
那么这里出了什么问题?我希望NSIS能够获得更好的文档或列出其命令参数/语法的警告。 (/咆哮)
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开关,将搜索匹配的目录和文件。
我发现
File /x "${DIRECTORY}Foo.img" "${DIRECTORY}*.img"
在编译时不排除Foo.img - 它包含在其他.img文件中。
/x
用于排除在编译时包含在安装程序中的某些文件。
如果我理解正确,您希望避免在运行时安装/升级期间覆盖文件。
因此,您可以在SetOverwrite
指令之前使用File
编译器标志。查看手册部分4.8.2.8 SetOverwrite,4.8.2部分还显示了动态处理SetOverwrite
的方法。
最后把我的一些头发拉出来后把它弄碎了......
首先从*.*
中排除整个子目录
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"
我认为问题是您不应该指定文件的完整路径以仅排除模式,因此换句话说,命令应如下所示:
File /r /x data\someFile.xml /x data\derbydb\runtime\*.* ${InputDir}\*.*
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
仍然会被复制作为第一次操作的一部分。