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

[文本处理] [已解決]批处理比较两个文件,只显示第2个文件不存在的行

[复制链接]
发表于 2020-4-18 23:21:34 | 显示全部楼层 |阅读模式
有两个文本文件,都是每一行,一个文件名,两个文件的行数可能不同。
比如1.txt里面比较全,2.txt没那么全,我想将1.txt中,多出来的文件名,显示出来,我使用fc 1.txt 2.txt

fc /w 1.txt 2.txt
正在比较文件 1.txt 和 2.TXT
***** 1.txt
Vol.211.rar
Vol.212.rar
Vol.213.rar
***** 2.TXT
Vol.211.rar
Vol.213.rar
*****

***** 1.txt
Vol.326.rar
Vol.329.rar
Vol.330.rar
***** 2.TXT
Vol.326.rar
Vol.330.rar
*****

的确可以显示出来,其中Vol.212.rar和Vol.329.rar就是多出来的文件名,但是fc会把Vol.211.rar
Vol.213.rar Vol.326.rar  Vol.330.rar 这几个已存在的也列出来,所以我想找高手用批处理,实现,只将Vol.212.rar和Vol.329.rar显示出来,其它的不显示,如何做到,谢谢!
发表于 2020-4-19 12:44:08 | 显示全部楼层
用findstr
  1. findstr /v /g:"2.txt" "1.txt"
复制代码

评分

参与人数 1技术 +1 收起 理由
thp2008 + 1 感谢提供的帮助

查看全部评分

 楼主| 发表于 2020-4-20 11:23:30 | 显示全部楼层
回复 2# went

非常好用,完全满足我的需要,非常感谢您的帮助!
 楼主| 发表于 2020-4-20 18:08:17 | 显示全部楼层
findstr /v /g:"file_list2.txt" "file_list1.txt"
Vol.197.rar
Vol.201.rar
Vol.204.rar
Vol.206.rar
Vol.207.rar
Vol.210.rar
Vol.217.rar
Vol.224.rar
我想再请教一下您
比如,我运行后,获得了这些文件名,我如何将每一个文件名作为变量,赋予给另一个命令,如下:
copy e:\data\vol.197.rar  d:\test\
copy e:\data\vol.201.rar  d:\test\
copy e:\data\vol.204.rar  d:\test\
copy e:\data\vol.206.rar  d:\test\
copy e:\data\vol.207.rar  d:\test\
copy e:\data\vol.210.rar  d:\test\
copy e:\data\vol.217.rar  d:\test\
copy e:\data\vol.224.rar  d:\test\

这样就可以全自动运行了,不用一个一个去拷贝了

谢谢!
发表于 2020-4-20 18:30:44 | 显示全部楼层
回复 4# thp2008
  1. @echo off
  2. for /f "delims=" %%i in ('findstr /v /g:"file_list2.txt" "file_list1.txt"') do (
  3.     copy "e:\data\%%i" "d:\test"
  4. )
复制代码

评分

参与人数 1技术 +1 收起 理由
thp2008 + 1 谢谢你,解决了问题

查看全部评分

 楼主| 发表于 2020-4-20 19:11:23 | 显示全部楼层
谢谢Batcher,搞定
 楼主| 发表于 2020-4-20 20:15:08 | 显示全部楼层
回复 2# went


我还想问问,在这个基础上,能不能用批处理,更深入一些进行比较,这是我根据你们提供的帮助,修改的一个比对的批处理。
我在想,可不可以更先进一些,生成两个文本文件目录列表的时候,带上文件的大小,顺便比较一下文件的大小是否一致,如果不一致,就将它的文件名列出来,麻烦大哥,再帮我修改一下,十分感谢!
  1. @echo off
  2. del file_list1.txt
  3. del file_list2.txt
  4. cls
  5. echo.
  6. echo 本批处理的功能:比较两个目标中,某一类行的文件,是否相同,不同的话,就列出缺少的文件名并可自动复制缺少的文件。
  7. echo.
  8. echo 源目录示例:D:\Download\Data
  9. set /p INP1=请输入第一个要比较的目录名的完整路径(源目录):
  10. echo.
  11. echo.
  12. echo 目标目录示例:E:\Share\A001
  13. set /p INP2=请输入第二个要比较的目录名的完整路径(目标目录):
  14. echo.
  15. echo.
  16. set /p filetype=请输入要比较的文件名称类型(例如:“*.rar”):

  17. dir "%INP1%\%filetype%" /b>>file_list1.txt
  18. dir "%INP2%\%filetype%" /b>>file_list2.txt

  19. findstr /v /g:"file_list2.txt" "file_list1.txt"
  20. echo.
  21. echo.
  22. echo 是否自动复制上述文件到目标目录。
  23. echo.
  24. pause
  25. echo.
  26. for /f "delims=" %%i in ('findstr /v /g:"file_list2.txt" "file_list1.txt"') do (
  27.     copy "%INP1%\%%i" "%INP2%"  && echo "%INP1%\%%i" "%INP2%"
  28. )
  29. echo.
  30. pause

  31. del file_list1.txt
  32. del file_list2.txt
复制代码
 楼主| 发表于 2020-4-20 21:07:16 | 显示全部楼层
本帖最后由 thp2008 于 2020-4-20 21:31 编辑

我在网上找到个方法,可以实现,但是发现有个小问题
代码如下:
  1. forfiles /P "%INP1%"  /m %filetype% /C "cmd /c echo @file @fsize"  >>file_list1.txt
  2. forfiles /P "%INP2%"  /m %filetype% /C "cmd /c echo @file @fsize"  >>file_list2.txt
复制代码
就是差生两个文件列表的时候,可以用这两个命令,问题一,但是我发现,就是比对后,列出了文件列表,也正确,但这个时候,传递给COPY的时候,因我多带了后面的文件大小,文件名就不正确了,如何传递的时候,只取前面的文件名,不要后面的文件大小。
格式如下:

"Vol.001.rar" 3287419372
"Vol.002.rar" 3305220652
"Vol.003.rar" 3267572228
"Vol.004.rar" 3212365756
"Vol.005.rar" 3105736980
"Vol.006.rar" 3172399796
  1. for /f "delims=" %%i in ('findstr /v /g:"file_list2.txt" "file_list1.txt"') do (
  2.     copy "%INP1%\%%i" "%INP2%"  && echo "%INP1%\%%i" "%INP2%"
复制代码
就这个问题,谢谢!
发表于 2020-4-20 23:18:31 | 显示全部楼层
回复 8# thp2008


    把"delims="去掉试试
 楼主| 发表于 2020-4-23 16:36:19 | 显示全部楼层
回复 9# went


    这招真的可以哟,谢谢
 楼主| 发表于 2020-4-23 16:39:27 | 显示全部楼层
我整个修改好的,放上来,给有同样需要的朋友直接用吧
  1. @echo off
  2. del file_list1.txt
  3. del file_list2.txt
  4. cls
  5. echo.
  6. echo 本批处理的功能:比较两个目标中,某一类行的文件,是否相同,不同的话,就列出缺少的文件名并可自动复制缺少的文件。
  7. echo.
  8. echo 源目录示例:D:\Download\Data
  9. set /p INP1=请输入第一个要比较的目录名的完整路径(源目录):
  10. echo.
  11. echo.
  12. echo 目标目录示例:E:\Share\A001
  13. set /p INP2=请输入第二个要比较的目录名的完整路径(目标目录):
  14. echo.
  15. echo.
  16. set /p filetype=请输入要比较的文件名称类型(例如:“*.rar”):

  17. REM dir "%INP1%\%filetype%" /b>>file_list1.txt
  18. REM dir "%INP2%\%filetype%" /b>>file_list2.txt
  19. forfiles /P "%INP1%"  /m %filetype% /C "cmd /c echo @file @fsize"  >>file_list1.txt
  20. forfiles /P "%INP2%"  /m %filetype% /C "cmd /c echo @file @fsize" >>file_list2.txt

  21. findstr /v /g:"file_list2.txt" "file_list1.txt"
  22. echo.
  23. echo.
  24. echo 是否自动复制上述文件到目标目录。
  25. echo.
  26. pause
  27. echo.
  28. for /f  %%i in ('findstr /v /g:"file_list2.txt" "file_list1.txt"') do (
  29.     copy "%INP1%\%%i" "%INP2%"  && echo "%INP1%\%%i" "%INP2%"
  30. )
  31. echo.
  32. pause
  33. del file_list1.txt
  34. del file_list2.txt
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-3-19 17:20 , Processed in 0.019887 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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