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

[文件操作] [已解决]批处理怎样对比出两个硬盘下的的不重名文件?

bat能不能扫描两个硬盘下的目录和文件,对比出两个硬盘下的的不重名文件夹和文件?

就是有两个硬盘,一个是主盘,一个是冷备份盘。主盘增加或者删除文件后隔一段时间我会手动同步到备份盘。

我希望以主盘为准,扫描出备份盘目录下的文件夹名和文件名(包含后缀)与主盘的不同之处,并且导出结果为txt文件。


希望能有手动指定硬盘和路径的选项!


如图所示:

以主盘I盘为准,根据备份盘E盘的文件与主盘I盘对比,把备份盘与主盘的目录文件夹和文件名的不同之处以txt文件导出来。

先扫描同名目录,再扫描同名目录下的文件。

分别导出“新增加”和“已删除”两个txt文件,
内容是不相同文件夹和文件的路径+文件名(包含后缀)

如果所示,两个txt的内容应为:

“新增加”
I:\1688K
I:\TES\ABC.txt

“已删除”
E:\Kugou
E:\TES\789.txt

  1. @echo off
  2. set a=I:\
  3. set b=E:\
  4. (for /f "tokens=2 delims=:" %%a in ('dir/b/s %a%') do (
  5. echo;%%a
  6. ))>a.txt
  7. (for /f "tokens=2 delims=:" %%a in ('dir/b/s %b%') do (
  8. echo;%%a
  9. ))>b.txt
  10. findstr /v /x /g:a.txt /f:b.txt >add.txt
  11. findstr /v /x /g:b.txt /f:a.txt >del.txt
  12. (for /f "delims=" %%a in (add.txt) do (
  13. <nul set/p =%a:~0,-1%&echo;%%a
  14. ))>新增加.txt
  15. (for /f "delims=" %%a in (del.txt) do (
  16. <nul set/p =%b:~0,-1%&echo;%%a
  17. ))>已删除.txt
  18. del a.txt b.txt add.txt del.txt
  19. pause
复制代码

TOP

回复 1# ChenCheChe


    推荐使用微软官方的同步软件:SyncToy
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

本帖最后由 idwma 于 2021-8-12 15:54 编辑

改一下可以任意路径
  1. @echo off
  2. set/p "a=路径1:"
  3. set/p "b=路径2:"
  4. call :n "%a%"
  5. (for /f "delims=" %%a in ('dir/b/s "%a%"') do (
  6. set str=%%a
  7. call;echo;%%str:~%n%%%
  8. ))>a.txt
  9. set n=
  10. call :n "%b%"
  11. (for /f "delims=" %%a in ('dir/b/s "%b%"') do (
  12. set str=%%a
  13. call;echo;%%str:~%n%%%
  14. ))>b.txt
  15. findstr /v /x /g:b.txt a.txt >add.txt
  16. findstr /v /x /g:a.txt b.txt >del.txt
  17. (for /f "delims=" %%a in (add.txt) do (
  18. <nul set/p "=%a%"
  19. echo;%%a
  20. ))>"新增加.txt"
  21. (for /f "delims=" %%a in (del.txt) do (
  22. <nul set/p "=%b%"
  23. echo;%%a
  24. ))>"已删除.txt"
  25. del a.txt b.txt add.txt del.txt
  26. pause
  27. goto :eof
  28. :n
  29. set/a n+=1
  30. set str=%~1
  31. call;set nn=%%str:~0,%n%%%
  32. if not "%nn%"=="%str%" goto :n
  33. goto :eof
复制代码

TOP

回复 4# idwma


这个代码刚刚试了一下,没有修改过的文件夹和文件都列了出来。
  路径下的全部文件都列了出来!

TOP

本帖最后由 idwma 于 2021-8-13 02:46 编辑

回复 5# ChenCheChe


    终究还是要上机呀,脑运不靠谱
  1. @echo off&setlocal enabledelayedexpansion
  2. set/p "a=路径1:"
  3. set/p "b=路径2:"
  4. call :n "%b%"
  5. (for /f "delims=" %%a in ('dir/b/s "%b%"') do (
  6. set str=%%a
  7. dir/b "!a!!str:~%n%!">nul 2>nul||echo;!b!!str:~%n%!
  8. ))>"已删除.txt"
  9. set n=
  10. call :n "%a%"
  11. (for /f "delims=" %%a in ('dir/b/s "%a%"') do (
  12. set str=%%a
  13. dir/b "!b!!str:~%n%!">nul 2>nul||echo;!a!!str:~%n%!
  14. ))>"新增加.txt"
  15. pause
  16. goto :eof
  17. :n
  18. set/a n+=1
  19. set str=%~1
  20. call;set nn=%%str:~0,%n%%%
  21. if not "%nn%"=="%str%" goto :n
  22. goto :eof
复制代码

TOP

用软件比较方便,用批处理比较烧脑

TOP

回复 6# idwma


  谢谢,刚刚试了,已经可以运行使用了,就是有个小小的问题想问问能不能再完美下。
现在这个代码扫描出两边硬盘存在不同名的文件夹后会记录文件夹名和子目录下的所有文件夹和文件。
当这个文件夹内的文件比较多就会卡顿耗费时间,所以我想能不能再修改一下变完美。

如果扫描到两边有不同名的文件夹时,就只记录这个文件夹名,不用再扫描记录这个不同名文件夹下的目录和文件。

TOP

回复 8# ChenCheChe


    这个不知道应该怎么跳过,技穷了

TOP

回复 9# idwma


非常感谢,那这样我想请问下,能不能弄另外一个代码,和帖子一样的要求,但是只扫描记录文件夹,不扫描记录文件的?

这样我就先运行这个扫文件夹的,再运行另外一个。

TOP

回复 10# ChenCheChe
  1. @echo off&setlocal enabledelayedexpansion
  2. set/p "a=路径1:"
  3. set/p "b=路径2:"
  4. call :n "%b%"
  5. (for /f "delims=" %%a in ('dir/ad/b/s "%b%"') do (
  6. set str=%%a
  7. dir/ad/b "!a!!str:~%n%!">nul 2>nul||echo;!b!!str:~%n%!
  8. ))>"已删除.txt"
  9. set n=
  10. call :n "%a%"
  11. (for /f "delims=" %%a in ('dir/ad/b/s "%a%"') do (
  12. set str=%%a
  13. dir/ad/b "!b!!str:~%n%!">nul 2>nul||echo;!a!!str:~%n%!
  14. ))>"新增加.txt"
  15. pause
  16. goto :eof
  17. :n
  18. set/a n+=1
  19. set str=%~1
  20. call;set nn=%%str:~0,%n%%%
  21. if not "%nn%"=="%str%" goto :n
  22. goto :eof
复制代码

TOP

回复 11# idwma


    非常感谢!

TOP

返回列表