[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文件操作] 【已解决】批处理AB文件夹俩相比较,多出则存放C文件夹

本帖最后由 zhengzhenhui 于 2024-4-28 18:27 编辑

目前这个代码,希望改进一下,显示是语法错误,未能复制文件。。
就是--A文件比B文件多出来则复制到C,
  1. @echo off
  2. rem 批处理保存为ansi编码格式
  3. set f1=A文件
  4. set f2=B文件
  5. set f3=A比B文件多的会存放到C文件
  6. for /f "tokens=1-2* delims= " %%a in ('robocopy "%f1%" "%f2%" /e /xc /xn /xo /l /x /fp ^|findstr /rb /c:" *新文件" /c:" *新目录"') do (
  7. echo 新文件\目录 [%%c]
  8. set file=%%c
  9. setlocal enabledelayedexpansion
  10. for /f "delims=" %%x in ("!file:%f1%=%f3%!") do (
  11. endlocal
  12. if exist "%%c\" (
  13. md "%%x" 2>nul
  14. ) else (
  15. md "%%~dpx" 2>nul
  16. copy "%%c" "%%x"
  17. )
  18. )
  19. )
  20. pause
复制代码
1

评分人数

    • Batcher: 感谢给帖子标题标注[已解决]字样PB + 2

本帖最后由 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
这可能是你的错误信息的原因
我只是猜,没验证

TOP

本帖最后由 wanghan519 于 2024-4-28 09:49 编辑

..........

TOP

回复 2# hnfeng


另外:setlocal enabledelayedexpansion 这行放到第一行。
可以删掉 endlocal

顶楼代码那样放置这两个命令是试图兼容带感叹号的文件名,你给放到第一行是不行的。
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

回复 4# Batcher


    哦,明白,谢谢指正

TOP

回复 3# wanghan519


在楼主的这个需求里面,使用Windows的findstr或Linux的grep差别不大,他遇到的难点不是比较两个文本内容,而是文件夹的比较。
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

回复 6# Batcher


    多谢指出,大意了
是要增量备份,类似rsync从a复制到c对比b忽略已经存在于b里的文件对吗
  1. rsync -av --ignore-existing --compare-dest=../b --dry-run a/ c
复制代码

TOP

当时测试的时候用的小文件,没有考虑到文件大小单位,修改如下:
  1. @echo off
  2. rem 批处理保存为ansi编码格式
  3. set f1=d:\1
  4. set f2=d:\2
  5. set f3=d:\3
  6. set "_f1=%f1:~0,1%"
  7. for /f "tokens=1* delims=:" %%a in ('robocopy "%f1%." "%f2%." /e /xc /xn /xo /l /x /fp ^|findstr /rb /c:" *新文件" /c:" *新目录"') do (
  8. echo 新文件\目录 [%_f1%:%%b]
  9. set "file=%_f1%:%%b"
  10. setlocal enabledelayedexpansion
  11. for /f "delims=" %%x in ("!file:%f1%=%f3%!") do (
  12. endlocal
  13. if exist "%_f1%:%%b\" (
  14. md "%%x" 2>nul
  15. ) else (
  16. md "%%~dpx" 2>nul
  17. copy "%_f1%:%%b" "%%x"
  18. )
  19. )
  20. )
  21. pause
复制代码
1

评分人数

bat小白,请多指教!谢谢!

TOP

回复 8# 77七


   
还是提示文件名  目录卷标语法不正确,漏掉一些文件了

TOP

回复 9# zhengzhenhui


   8楼代码点 copy 按钮复制,代码中已经固定打印 [盘符:],不应该会出现 [m后跟空格的
bat小白,请多指教!谢谢!

TOP

回复 10# 77七


    奇怪了,,,应该是我代码粘贴错了 ,晚上我用大文件跑一下代码看看

TOP

本帖最后由 zhengzhenhui 于 2024-4-28 17:15 编辑

回复 10# 77七


    已测试,我这边是30G的文件,AB比较后存入C文件夹,会出现运行结束后部分文件漏掉的情况
比如--A文件是30G   B文件拿空文件夹测试   C文件只有28G
(A文件是作为增量对比B,然后存入C的,这段代码B其实是不动的)

TOP

  1. @echo off
  2. rem 批处理保存为ansi编码格式
  3. set f1=d:\1
  4. set f2=d:\2
  5. set f3=d:\3
  6. robocopy "%f1%." "%f2%." /e /xc /xn /xo /l /x /fp |findstr /rb /c:" *新文件" /c:" *新目录" >#.txt
  7. pause
复制代码

执行这段代码,看看漏掉的文件是否在 #.txt 中出现,及该文件完整路径是否含有特殊符号
bat小白,请多指教!谢谢!

TOP

本帖最后由 zhengzhenhui 于 2024-4-28 18:35 编辑

回复 13# 77七


不好意思找到原因了,是特殊字符引起的识别错误导致的文件缺失,,我规范一下文件夹名字
文件夹为(2024-3月21日)就识别不到文件夹的

TOP

如果特殊字符处理后,改用xcopy可行不
  1. for /f "tokens=1*" %%a in ('robocopy "%f1%" "%f2%" /e /xc /xn /xo /l /x /fp /NS /NJH /NJS ^| findstr /rb /c:"[ ]*新文件" /c:"[ ]*新目录"') do (
  2.      set file=%%b
  3.      setlocal enabledelayedexpansion
  4.      call set "file2=%%file:!f1!=!f3!%%"
  5.      for /f "tokens=*" %%f in ("!file2!") do (
  6.           endlocal
  7.           XCOPY "%%b" /Y /H /R "%%~dpf"
  8.     )
  9. )
复制代码
1

评分人数

    • 77七: 感谢分享,学习了!技术 + 1

TOP

返回列表