标题: [文件操作] 批处理如何查找批量文件并复制到另一个文件夹? [打印本页]
作者: 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 编辑
- @echo off
- title By Author GIN 2021/05/25
- SETLOCAL ENABLEDELAYEDEXPANSION
-
- set souceFile=files.txt
- set targetDir=d:\gin\c#
- set notFoundFileName=未找到.txt
-
- set newDirectory=%cd%\newDirectory
- if not exist %newDirectory% (md "%newDirectory%")
- REM 源路径为:d:\gin\c#
- REM 新路径为:D:\GIN\copyFile\newDirectory
- echo 源路径为:%targetDir%
- echo 新路径为:%newDirectory%
-
- call :equalTotalChar "%targetDir%" "%newDirectory%"
- set equalCharTotal=!errorlevel!
- call :readFileList "%souceFile%"
- call :getTargetinfo "%targetDir%"
- call :matchTarget
- call :deleteSourceFile
-
- pause & exit
-
- REM 计算顶部路径相同部分
- :equalTotalChar
- set sourcePath=%~1
- set newPath=%~2
- for /l %%i in (0,1,255) do (
- if /i "!sourcePath:~%%i,1!" neq "!newPath:~%%i,1!" (
- if /i "!sourcePath:~%%i,1!" equ "\" (exit /b %%i) else (
- for /l %%b in (%%i,-1,0) do (
- if "!sourcePath:~%%b,1!" equ "\" (exit /b %%b)
- )
- )
- )
- )
- exit /b 0
-
- REM 读取文件列表
- :readFileList
- set fileName=%1
- set /a sourceFileLines = 0
- for /f "tokens=*" %%L in ('type %fileName%') do (set /a sourceFileLines+=1 & set "source_!sourceFileLines!=%%L")
- exit /b
-
- REM 获取目标目录信息
- :getTargetinfo
- set targetDirectory=%1
- set /a targetNumber=0
- for /f "tokens=*" %%u in ('dir /b /s %targetDirectory%') do (set /a targetNumber+=1 & set "target_!targetNumber!=%%u")
- exit /b
-
- REM 匹配目标
- :matchTarget
- echo 数据源数量为:%sourceFileLines%
- set /a deleteNumber=0
- echo %date% %time% >> %notFoundFileName%
- for /l %%s in (1,1,%sourceFileLines%) do (
- echo 正在处理第 %%s 个,!source_%%s!
- set found=false
- for /l %%t in (1,1,%targetNumber%) do (
- call :getFileOrDirectoryName "!source_%%s!" "!target_%%t!" & set matchResult=!errorlevel!
- if !matchResult! equ 1 (
- set found=true
- set "tempNewDirOrFile=%newDirectory%!target_%%t:~%equalCharTotal%!"
- pushd "!target_%%t!" && popd & (
- if not exist "!tempNewDirOrFile!" (
- md "!tempNewDirOrFile!" && xcopy /e /y "!target_%%t!" "!tempNewDirOrFile!"
- )
- ) || (
- if exist "!tempNewDirOrFile!" (
- echo f | xcopy /y "!target_%%t!" "!tempNewDirOrFile!"
- ) else (
- echo f | xcopy "!target_%%t!" "!tempNewDirOrFile!"
- )
- )
- set /a deleteNumber+=1 & set "deleteSourceFileOrDirectory_!deleteNumber!=!target_%%t!"
- ) 1>nul 2>nul
- )
- if "!found!" equ "false" (
- echo !source_%%s! >> %notFoundFileName%
- )
- )
- exit /b
-
- REM 匹配 目标判断
- :getFileOrDirectoryName
- set "souce=%1"
- set "target=%~nx2"
- if %souce% == "%target%" (exit /b 1)
- exit /b 0
-
- REM 删除源文件
- :deleteSourceFile
- echo 是否删除所有原路径下已经被复制的文件和文件夹?
- echo 输入 Y 是,N 否:
- choice
- set input=%errorlevel%
- if %input% neq 1 (exit /b)
- for /l %%n in (1,1,!deleteNumber!) do (del /p /s !deleteSourceFileOrDirectory_%%n!)
- 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 |