Board logo

标题: [文件操作] 批处理如何查找批量文件并复制到另一个文件夹? [打印本页]

作者: bataiping    时间: 2021-5-25 10:28     标题: 批处理如何查找批量文件并复制到另一个文件夹?

需求比较复杂,大佬帮忙看看

现有:file.txt一个,里面有1000多个换行的文件名(有些有后缀,有些没,有些是文件夹)

根据这个txt里面列出来的文件名,到另一个文件夹a里(含下面所有级别的子文件夹)去依次检索文件名或文件夹名。

检索出来的文件/文件夹按照a文件夹下面的原有路径放到(复制)另一个指定文件夹b,注意b现在还是个空文件夹。

未找到的文件名输出到另一个"未找到.txt"文件里。

示例:

file.txt里面内容:
0007cebt
a400cebt
千岛湖3月拍摄.jpg
2016-5-7


需要进行的操作:
找到:a\ccbbt\2017\vae\0007cebt.pdf
放到:b\ccbbt\2017\vae\里面

未找到:a400cebt
将内容 "a400cebt" 写入"未找到.txt"里面

找到:a\照片\千岛湖3月拍摄.jpg
放到:b\照片\里面

找到:a\2016\2016-5-7(文件夹)
整个文件夹放到:b\2016里面

最后询问是否删除所有原路径下已经被复制的文件和文件夹
作者: Gin_Q    时间: 2021-5-25 16:42

本帖最后由 Gin_Q 于 2021-5-29 13:16 编辑
  1. @echo off
  2. title By Author GIN 2021/05/25
  3. SETLOCAL ENABLEDELAYEDEXPANSION
  4. set souceFile=files.txt
  5. set targetDir=d:\gin\c#
  6. set notFoundFileName=未找到.txt
  7. set newDirectory=%cd%\newDirectory
  8. if not exist %newDirectory% (md "%newDirectory%")
  9. REM 源路径为:d:\gin\c#
  10. REM 新路径为:D:\GIN\copyFile\newDirectory
  11. echo 源路径为:%targetDir%
  12. echo 新路径为:%newDirectory%
  13. call :equalTotalChar "%targetDir%" "%newDirectory%"
  14. set equalCharTotal=!errorlevel!
  15. call :readFileList "%souceFile%"
  16. call :getTargetinfo "%targetDir%"
  17. call :matchTarget
  18. call :deleteSourceFile
  19. pause & exit
  20. REM 计算顶部路径相同部分
  21. :equalTotalChar
  22.     set sourcePath=%~1
  23.     set newPath=%~2
  24.     for /l %%i in (0,1,255) do (
  25.         if /i "!sourcePath:~%%i,1!" neq "!newPath:~%%i,1!" (
  26.             if /i "!sourcePath:~%%i,1!" equ "\" (exit /b %%i) else (
  27.                 for /l %%b in (%%i,-1,0) do (
  28.                     if "!sourcePath:~%%b,1!" equ "\" (exit /b %%b)
  29.                 )
  30.             )
  31.         )
  32.     )
  33.     exit /b 0
  34. REM 读取文件列表
  35. :readFileList
  36.     set fileName=%1
  37.     set /a sourceFileLines = 0
  38.     for /f "tokens=*" %%L in ('type %fileName%') do (set /a sourceFileLines+=1 & set "source_!sourceFileLines!=%%L")
  39.     exit /b
  40. REM 获取目标目录信息
  41. :getTargetinfo
  42.     set targetDirectory=%1
  43.     set /a targetNumber=0
  44.     for /f "tokens=*" %%u in ('dir /b /s %targetDirectory%') do (set /a targetNumber+=1 & set "target_!targetNumber!=%%u")
  45.     exit /b
  46.    
  47. REM 匹配目标
  48. :matchTarget
  49.     echo 数据源数量为:%sourceFileLines%
  50.     set /a deleteNumber=0
  51.     echo %date% %time% >> %notFoundFileName%
  52.     for /l %%s in (1,1,%sourceFileLines%) do (
  53.         echo 正在处理第 %%s 个,!source_%%s!
  54.         set found=false
  55.         for /l %%t in (1,1,%targetNumber%) do (
  56.             call :getFileOrDirectoryName "!source_%%s!" "!target_%%t!" & set matchResult=!errorlevel!
  57.             if !matchResult! equ 1 (
  58.                 set found=true
  59.                 set "tempNewDirOrFile=%newDirectory%!target_%%t:~%equalCharTotal%!"
  60.                 pushd "!target_%%t!" && popd & (
  61.                     if not exist "!tempNewDirOrFile!" (
  62.                         md "!tempNewDirOrFile!" && xcopy /e /y "!target_%%t!" "!tempNewDirOrFile!"
  63.                     )
  64.                 ) || (
  65.                     if exist "!tempNewDirOrFile!" (
  66.                         echo f | xcopy /y "!target_%%t!" "!tempNewDirOrFile!"
  67.                     ) else (
  68.                         echo f | xcopy "!target_%%t!" "!tempNewDirOrFile!"
  69.                     )
  70.                 )
  71.                 set /a deleteNumber+=1 & set "deleteSourceFileOrDirectory_!deleteNumber!=!target_%%t!"
  72.             ) 1>nul 2>nul
  73.         )
  74.         if "!found!" equ "false" (
  75.             echo !source_%%s! >> %notFoundFileName%
  76.         )
  77.     )
  78.     exit /b
  79. REM 匹配 目标判断
  80. :getFileOrDirectoryName
  81.     set "souce=%1"
  82.     set "target=%~nx2"
  83.     if %souce% == "%target%" (exit /b 1)
  84.     exit /b 0
  85. REM 删除源文件
  86. :deleteSourceFile
  87.     echo 是否删除所有原路径下已经被复制的文件和文件夹?
  88.     echo 输入 Y 是,N 否:
  89.     choice
  90.     set input=%errorlevel%
  91.     if %input% neq 1 (exit /b)
  92.     for /l %%n in (1,1,!deleteNumber!) do (del /p /s !deleteSourceFileOrDirectory_%%n!)
  93.     exit /b
复制代码

作者: bataiping    时间: 2021-5-26 17:22

本帖最后由 bataiping 于 2021-5-26 17:31 编辑

回复 2# Gin_Q
谢谢,已测试,这里发现有一个小问题:
newDirectory文件夹里复制出来的文件,最后一级文件夹名称错误,多套了一层和文件名一样的文件夹
请问怎么修改好一点。
作者: Gin_Q    时间: 2021-5-26 17:51

回复 3# bataiping


    不太清楚,不知道你那边情况。我这边环境没有出现这个问题。脚本文件必须要放在源目录盘符下。
作者: bataiping    时间: 2021-5-26 18:24

回复 4# Gin_Q


    那我再重新测试一下,另外,最后按了Y之后,提示找不到文件,不知道是不是我这边的问题
作者: bataiping    时间: 2021-5-26 18:37

回复 4# Gin_Q

我做了个示例文件压缩包,但是我好像不能上传附件




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2