找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 90815|回复: 17

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

[复制链接]
发表于 2024-4-28 02:07:34 | 显示全部楼层 |阅读模式
本帖最后由 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
复制代码

评分

参与人数 1PB +2 收起 理由
Batcher + 2 感谢给帖子标题标注[已解决]字样

查看全部评分

发表于 2024-4-28 08:30:41 | 显示全部楼层
本帖最后由 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
这可能是你的错误信息的原因
我只是猜,没验证
发表于 2024-4-28 08:36:36 | 显示全部楼层
本帖最后由 wanghan519 于 2024-4-28 09:49 编辑

..........
发表于 2024-4-28 08:38:24 | 显示全部楼层
回复 2# hnfeng


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

顶楼代码那样放置这两个命令是试图兼容带感叹号的文件名,你给放到第一行是不行的。
发表于 2024-4-28 08:43:18 | 显示全部楼层
回复 4# Batcher


    哦,明白,谢谢指正
发表于 2024-4-28 08:43:24 | 显示全部楼层
回复 3# wanghan519


在楼主的这个需求里面,使用Windows的findstr或Linux的grep差别不大,他遇到的难点不是比较两个文本内容,而是文件夹的比较。
发表于 2024-4-28 09:47:10 | 显示全部楼层
回复 6# Batcher


    多谢指出,大意了
是要增量备份,类似rsync从a复制到c对比b忽略已经存在于b里的文件对吗
  1. rsync -av --ignore-existing --compare-dest=../b --dry-run a/ c
复制代码
发表于 2024-4-28 12:00:37 | 显示全部楼层
当时测试的时候用的小文件,没有考虑到文件大小单位,修改如下:
  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技术 +1 收起 理由
Batcher + 1 乐于助人

查看全部评分

 楼主| 发表于 2024-4-28 13:22:33 | 显示全部楼层
回复 8# 77七


   
还是提示文件名  目录卷标语法不正确,漏掉一些文件了
发表于 2024-4-28 13:40:38 | 显示全部楼层
回复 9# zhengzhenhui


   8楼代码点 copy 按钮复制,代码中已经固定打印 [盘符:],不应该会出现 [m后跟空格的
 楼主| 发表于 2024-4-28 14:24:13 | 显示全部楼层
回复 10# 77七


    奇怪了,,,应该是我代码粘贴错了 ,晚上我用大文件跑一下代码看看
 楼主| 发表于 2024-4-28 17:14:10 | 显示全部楼层
本帖最后由 zhengzhenhui 于 2024-4-28 17:15 编辑

回复 10# 77七


    已测试,我这边是30G的文件,AB比较后存入C文件夹,会出现运行结束后部分文件漏掉的情况
比如--A文件是30G   B文件拿空文件夹测试   C文件只有28G
(A文件是作为增量对比B,然后存入C的,这段代码B其实是不动的)
发表于 2024-4-28 17:24:43 | 显示全部楼层
  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 中出现,及该文件完整路径是否含有特殊符号
 楼主| 发表于 2024-4-28 18:17:27 | 显示全部楼层
本帖最后由 zhengzhenhui 于 2024-4-28 18:35 编辑

回复 13# 77七


不好意思找到原因了,是特殊字符引起的识别错误导致的文件缺失,,我规范一下文件夹名字
文件夹为(2024-3月21日)就识别不到文件夹的
发表于 2024-4-28 18:48:43 | 显示全部楼层
如果特殊字符处理后,改用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技术 +1 收起 理由
77七 + 1 感谢分享,学习了!

查看全部评分

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-18 03:22 , Processed in 0.025641 second(s), 9 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表