You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 17:55:18