BAT批处理:文件批量查找与复制

近期因为工作需要,经常要根据文件清单批量查找文件并复制到指定文件夹,手动操作十分繁琐。因此,参考本站文章编写了一个文件批量查找与复制的批处理程序。

参考文章:http://t.csdnimg.cn/aNciG

本文程序的主体代码来自上方参考文章,与其相比增加了手动输入相关参数的功能。

1、程序代码

@echo off
setlocal enabledelayedexpansion

echo -------------------------------- BEGIN ----------------------------------
 
rem set parameter here
rem dirCopy: 0-file copy, 1-directory copy
rem path do not end with backslash
rem sourcePath only support one path when use directory copy, multi path(separated by semicolons and make sure all path is exist) is available when use file copy
rem eg:
rem     file copy:
rem         set sourcePath=C:\Users\Desktop\test 1;C:\Users\Desktop\test2
rem         set targetPath=C:\Users\Desktop\target
rem         set fileList=list.txt
rem         set dirCopy=0  
rem     directory copy:
rem         set sourcePath=C:\Users\Desktop\test 1
rem         set targetPath=C:\Users\Desktop\target
rem         set fileList=list.txt
rem         set dirCopy=1

set /p sourcePath=Source path:
set /p targetPath=Target path:
set /p fileList=Search file:
set /p dirCopy=Copy type(0-file,1-dir):




rem add double quotes
set before=!sourcePath!
set after=


echo Job running...

:QUOTE_LOOP
for /f "tokens=1* delims=;" %%i in ("!before!") do (
    set after=!after!"%%i";
    if not "%%j"=="" (
        set before=%%j
        goto QUOTE_LOOP
    )
)




rem begin job
set /a copyCount=0
dir /s /b !after!>filelist.txt
if !dirCopy! equ 0 (
    echo Start coping files...
    goto FILE_COPY
)else (
    echo Start coping file dir...
    goto DIR_COPY
)


:FILE_COPY
for /f "delims=" %%i in (!fileList!) do (
    find "\%%i" filelist.txt > findfile.txt
    if !errorlevel! equ 0 (
        for /f "skip=2 delims=" %%j in (findfile.txt) do (
            copy /y "%%j" "!targetPath!\%%~nxj">nul
            set /a copyCount+=1
        )
    )else (
        echo Can't find file %%i
        echo %%i >> failedfile.txt
    )
)
goto END


:DIR_COPY
for /f "delims=" %%i in (!fileList!) do (
    find "\%%i" filelist.txt > findfile.txt
    if !errorlevel! equ 0 (
        for /f "skip=2 delims=" %%j in (findfile.txt) do (
            set tPath=%%~fj
            set tPath=!tPath:%sourcePath%=!
            echo f | xcopy /y "%%j" "!targetPath!!tPath!">nul
            set /a copyCount+=1
        )
    )else (
        echo Can't find file: %%i
        echo %%i >> failedfile.txt
    )
)
goto END



:END


del filelist.txt
del findfile.txt

echo Copy file success: !copyCount!
echo --------------------------------  END  ----------------------------------


pause

2、操作指南

  1. 将上方代码复制至txt文件,将txt文件的后缀修改为BAT并保存。本文程序文件以“文件批量查找与复制 - 手动输入版.BAT”命名。
  2. 新建BATCopyFiles文件夹用来当做程序的操作空间,包含以下文件(夹):source文件夹、target文件夹、list.txt、文件批量查找与复制 - 手动输入版.BAT。
    source文件夹用来存放需要用于查找的文件库
    target文件夹用来复制、存放查找成功的文件
    list.txt内容为需要查找复制的文件清单,内容以换行区分,文件名可不包含后缀
    文件批量查找与复制 - 手动输入版.BAT内容为程序代码
    注意:文件夹路径不能包含中文!!!
  3. 双击“文件批量查找与复制 - 手动输入版.BAT”运行程序,依次输入参数。
    Source path:source源文件夹,可填其他文件夹的绝对路径
    Target path:target目标文件夹,可填其他文件夹的绝对路径
    Search file:list.txt文件清单
    Copy type(0-file,1-dir):0/1复制类型:0-文件,1-文件及完整路径

  4. 查看输出结果。

    查询成功的文件将会被复制至target文件夹;查询失败的文件将会被记录在自动生成的failedfile.txt文件中。