NSIS如何用单个命令安装相似文件夹结构的多文件?
NSIS批量复制相似结构文件夹中的文件问题
你的问题核心是NSIS原生File命令不支持路径中间的*通配符,只能在最后一级目录或文件名位置使用通配符,所以.\ParentFolder\*\Same\Path\For\All\*.ext这种写法会找不到文件。
下面是两种无需手动修改脚本的解决方案:
方法一:用NSIS原生命令遍历子目录
通过FindFirst/FindNext循环遍历ParentFolder下的所有子目录,逐个检查并复制目标路径的文件:
SetOutPath "$INSTDIR\Final\Destination" ; 初始化遍历,获取ParentFolder下的第一个子项 FindFirst $R0 $R1 ".\ParentFolder\*" loop: ; 子项为空时结束循环 StrCmp $R1 "" done ; 跳过系统默认的.和..目录 StrCmp $R1 "." skip StrCmp $R1 ".." skip ; 检查当前子目录下是否存在目标文件 IfFileExists ".\ParentFolder\$R1\Same\Path\For\All\*.ext" 0 skip ; 复制该目录下的所有.ext文件(包括子目录,若不需要/r可去掉) File /r ".\ParentFolder\$R1\Same\Path\For\All\*.ext" skip: ; 获取下一个子项 FindNext $R0 $R1 Goto loop done: ; 关闭遍历句柄 FindClose $R0
方法二:用FileFunc插件简化代码
如果你的NSIS环境支持插件,可以使用FileFunc.nsh提供的封装命令,代码更简洁:
!include "FileFunc.nsh" !include "LogicLib.nsh" SetOutPath "$INSTDIR\Final\Destination" ; 遍历ParentFolder下的子目录 ${FindFirst} $R0 $R1 ".\ParentFolder\*" ${While} $R1 != "" ${If} $R1 != "." && $R1 != ".." ; 存在目标文件时才执行复制 ${IfFileExists} ".\ParentFolder\$R1\Same\Path\For\All\*.ext" ${_do_copy} ${_continue} ${_do_copy}: File /r ".\ParentFolder\$R1\Same\Path\For\All\*.ext" ${EndIf} ${_continue}: ${FindNext} $R0 $R1 ${EndWhile} ${FindClose} $R0
注意事项
- 如果不需要复制目标目录下的子文件夹内容,去掉
File命令后的/r参数即可。 - 脚本会自动遍历
ParentFolder下的所有子目录,后续新增/删除子目录时无需修改脚本。
内容的提问来源于stack exchange,提问作者Tyler
相关产品推荐
相关产品推荐

