PAYATHON 2026

Windows 批处理如何遍历数组中的目录及子目录并集中复制 .txt 文件?

数据小陈

可以保留现有数组,只在其中保存起始目录。使用 for /r 递归查找各目录中的 .txt 文件,再用 copy 将文件复制到同一个目标文件夹,无需把所有子目录加入数组。

为什么原脚本没有复制子目录中的文件?

原来的命令:

copy !Arr[%%n]!\*.txt %dest%

只匹配指定目录当前层级中的 .txt 文件。copy 不会递归搜索子目录,需要用 for /r 遍历。

可直接使用的批处理脚本

将下面的代码保存为 .bat 文件并运行:

@echo off
setlocal enabledelayedexpansion

set "Arr[0]=M:\0_Backup_Keep"
set "Arr[1]=M:\0_Delete"
set "Arr[2]=M:\0_Reserved"

set "dest=M:\Test_txt"

if not exist "%dest%\" mkdir "%dest%"
if not exist "%dest%\" exit /b 1

for /l %%n in (0,1,2) do (
    echo Searching: !Arr[%%n]!
    pushd "!Arr[%%n]!" && (
        for /r %%F in (*.txt) do (
            copy /-y "%%~fF" "%dest%\"
        )
        popd
    )
)

echo.
echo Files sorted by name:
dir /b /a-d /o:n "%dest%\*.txt"

endlocal
pause

外层 for /l 依次读取三个数组元素。pushd 进入相应目录后,for /r 从该目录开始递归查找 .txt 文件,包括顶层和所有子目录。&& 保证只有成功进入源目录后才开始遍历,遍历结束后 popd 恢复之前的工作目录。

%%~fF 表示找到的文件的完整路径。文件都复制到同一个目标目录,不会创建对应的子目录结构。路径两侧的双引号用于支持包含空格的目录名。

同名文件如何处理?

多个目录中的文件放进同一个文件夹时,可能会遇到同名文件。例如,两个子目录都包含 notes.txt,目标文件夹无法同时保存这两个同名文件。

示例使用 copy /-y,遇到已存在的目标文件时会询问是否覆盖。如果确定允许覆盖,可以改成:

copy /y "%%~fF" "%dest%\"

使用 /y 时,后复制的同名文件会覆盖先复制的文件。如果需要保留每个版本,就必须另行设计重命名规则。

如何按字母顺序显示?

复制顺序不决定文件夹的显示顺序。脚本最后使用:

dir /b /a-d /o:n "%dest%\*.txt"

其中 /b 只输出名称,/a-d 排除目录,/o:n 按名称排序。在文件资源管理器中查看时,选择按“名称”升序排列即可。

使用时需要注意什么?

目标文件夹应放在所有源目录之外,避免遍历时再次处理已经复制出来的文件。题目中的 M:\Test_txt 与三个源目录并列,符合这个条件。

这份脚本沿用原脚本的 delayed expansion 写法。如果路径或文件名包含 !,可能在变量展开时被改变,需要改用关闭 delayed expansion 的遍历方案。批处理文件中的循环变量使用 %%F;直接在命令提示符中执行时则使用 %F。

备注:内容仅供参考。