标题: [文件操作] 【已解决】批处理AB文件夹俩相比较,多出则存放C文件夹 [打印本页]
作者: zhengzhenhui 时间: 2024-4-28 02:07 标题: 【已解决】批处理AB文件夹俩相比较,多出则存放C文件夹
本帖最后由 zhengzhenhui 于 2024-4-28 18:27 编辑
目前这个代码,希望改进一下,显示是语法错误,未能复制文件。。
就是--A文件比B文件多出来则复制到C,- @echo off
- rem 批处理保存为ansi编码格式
- set f1=A文件
- set f2=B文件
- set f3=A比B文件多的会存放到C文件
-
- for /f "tokens=1-2* delims= " %%a in ('robocopy "%f1%" "%f2%" /e /xc /xn /xo /l /x /fp ^|findstr /rb /c:" *新文件" /c:" *新目录"') do (
- echo 新文件\目录 [%%c]
- set file=%%c
- setlocal enabledelayedexpansion
- for /f "delims=" %%x in ("!file:%f1%=%f3%!") do (
- endlocal
- if exist "%%c\" (
- md "%%x" 2>nul
- ) else (
- md "%%~dpx" 2>nul
- copy "%%c" "%%x"
- )
- )
- )
- pause
复制代码
作者: hnfeng 时间: 2024-4-28 08:30
本帖最后由 hnfeng 于 2024-4-28 08:35 编辑
如果“目录”和“文件”分开处理是不是会简单一些
robocopy c:\Dir1 e:\Dir1 /mir /l /fp /njs /njh | findstr /i "新目录"
然后 MD 新目录
再 robocopy c:\Dir1 e:\Dir1 /mir /l /fp /njs /njh | findstr /i "新文件"
Copy 新文件
另外:setlocal enabledelayedexpansion 这行放到第一行。
可以删掉 endlocal
这可能是你的错误信息的原因
我只是猜,没验证
作者: wanghan519 时间: 2024-4-28 08:36
本帖最后由 wanghan519 于 2024-4-28 09:49 编辑
..........
作者: Batcher 时间: 2024-4-28 08:38
回复 2# hnfeng
另外:setlocal enabledelayedexpansion 这行放到第一行。
可以删掉 endlocal
顶楼代码那样放置这两个命令是试图兼容带感叹号的文件名,你给放到第一行是不行的。
作者: hnfeng 时间: 2024-4-28 08:43
回复 4# Batcher
哦,明白,谢谢指正
作者: Batcher 时间: 2024-4-28 08:43
回复 3# wanghan519
在楼主的这个需求里面,使用Windows的findstr或Linux的grep差别不大,他遇到的难点不是比较两个文本内容,而是文件夹的比较。
作者: wanghan519 时间: 2024-4-28 09:47
回复 6# Batcher
多谢指出,大意了
是要增量备份,类似rsync从a复制到c对比b忽略已经存在于b里的文件对吗- rsync -av --ignore-existing --compare-dest=../b --dry-run a/ c
复制代码
作者: 77七 时间: 2024-4-28 12:00
当时测试的时候用的小文件,没有考虑到文件大小单位,修改如下:- @echo off
- rem 批处理保存为ansi编码格式
- set f1=d:\1
- set f2=d:\2
- set f3=d:\3
-
- set "_f1=%f1:~0,1%"
- for /f "tokens=1* delims=:" %%a in ('robocopy "%f1%." "%f2%." /e /xc /xn /xo /l /x /fp ^|findstr /rb /c:" *新文件" /c:" *新目录"') do (
- echo 新文件\目录 [%_f1%:%%b]
- set "file=%_f1%:%%b"
- setlocal enabledelayedexpansion
- for /f "delims=" %%x in ("!file:%f1%=%f3%!") do (
- endlocal
- if exist "%_f1%:%%b\" (
- md "%%x" 2>nul
- ) else (
- md "%%~dpx" 2>nul
- copy "%_f1%:%%b" "%%x"
- )
- )
- )
- pause
复制代码
作者: zhengzhenhui 时间: 2024-4-28 13:22
回复 8# 77七
还是提示文件名 目录卷标语法不正确,漏掉一些文件了
作者: 77七 时间: 2024-4-28 13:40
回复 9# zhengzhenhui
8楼代码点 copy 按钮复制,代码中已经固定打印 [盘符:],不应该会出现 [m后跟空格的
作者: zhengzhenhui 时间: 2024-4-28 14:24
回复 10# 77七
奇怪了,,,应该是我代码粘贴错了 ,晚上我用大文件跑一下代码看看
作者: zhengzhenhui 时间: 2024-4-28 17:14
本帖最后由 zhengzhenhui 于 2024-4-28 17:15 编辑
回复 10# 77七
已测试,我这边是30G的文件,AB比较后存入C文件夹,会出现运行结束后部分文件漏掉的情况
比如--A文件是30G B文件拿空文件夹测试 C文件只有28G
(A文件是作为增量对比B,然后存入C的,这段代码B其实是不动的)
作者: 77七 时间: 2024-4-28 17:24
- @echo off
- rem 批处理保存为ansi编码格式
- set f1=d:\1
- set f2=d:\2
- set f3=d:\3
-
- robocopy "%f1%." "%f2%." /e /xc /xn /xo /l /x /fp |findstr /rb /c:" *新文件" /c:" *新目录" >#.txt
- pause
复制代码
执行这段代码,看看漏掉的文件是否在 #.txt 中出现,及该文件完整路径是否含有特殊符号
作者: zhengzhenhui 时间: 2024-4-28 18:17
本帖最后由 zhengzhenhui 于 2024-4-28 18:35 编辑
回复 13# 77七
不好意思找到原因了,是特殊字符引起的识别错误导致的文件缺失,,我规范一下文件夹名字
文件夹为(2024-3月21日)就识别不到文件夹的
作者: terse 时间: 2024-4-28 18:48
如果特殊字符处理后,改用xcopy可行不- for /f "tokens=1*" %%a in ('robocopy "%f1%" "%f2%" /e /xc /xn /xo /l /x /fp /NS /NJH /NJS ^| findstr /rb /c:"[ ]*新文件" /c:"[ ]*新目录"') do (
- set file=%%b
- setlocal enabledelayedexpansion
- call set "file2=%%file:!f1!=!f3!%%"
- for /f "tokens=*" %%f in ("!file2!") do (
- endlocal
- XCOPY "%%b" /Y /H /R "%%~dpf"
- )
- )
复制代码
作者: zhengzhenhui 时间: 2024-4-28 19:19
回复 15# terse
A-B-C三个文件夹路径该如何填写进去。。
作者: terse 时间: 2024-4-28 19:29
回复 16# zhengzhenhui
set f1=A文件
set f2=B文件
set f3=A比B文件多的会存放到C文件
作者: zhengzhenhui 时间: 2024-4-28 20:17
是这样吗- for /f "tokens=1*" %%a in ('robocopy "%路径1%" "%路径2%" /e /xc /xn /xo /l /x /fp /NS /NJH /NJS ^| findstr /rb /c:"[ ]*新文件" /c:"[ ]*新目录"') do (
- set file=%%b
- setlocal enabledelayedexpansion
- call set "file2=%%file:!路径1!=!路径3!%%"
- for /f "tokens=*" %%f in ("!file2!") do (
- endlocal
- XCOPY "%%b" /Y /H /R "%%~dpf"
- )
- )
复制代码
回复 17# terse
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |