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

[文件操作] 求助批处理循环遍历指定文件夹下的文件获取文件名,比对某文件内的文本内容

[复制链接]
发表于 2022-7-28 09:11:42 | 显示全部楼层 |阅读模式
背景:
1、文件夹A 下 有10W个文件(无子文件夹),文件名杂乱无序的字符串(A1~AN);
2、文件B是一个txt文件,里面有4W行,每一行是一个字符串(如A5)。
3、文件夹C
想要达到的效果:
遍历文件夹A,获取其下的10W个文件的文件名,循环比对文件B的行内容,若两者相等,则将A下的文件复制或移动到文件夹C下。(由原来:A\A5 变成 现在的 C\A5)
发表于 2022-7-28 09:19:49 | 显示全部楼层
本帖最后由 LJY4.0 于 2022-7-28 09:21 编辑

请问文件是否有后缀
比如.txt
发表于 2022-7-28 09:27:30 | 显示全部楼层
本帖最后由 LJY4.0 于 2022-7-28 10:04 编辑

这是无后缀:
  1. @echo off
  2. for /f "delims=" %%a in (B文件夹\list.txt) do (
  3. if exist A文件夹\%%a copy A文件夹\%%a C文件夹
  4. ))
复制代码
这是有后缀:
  1. @echo off
  2. for /f "delims=" %%a in (B文件夹\list.txt) do (
  3. if exist A文件夹\%%a.* copy A文件夹\%%a.* C文件夹
  4. ))
复制代码
 楼主| 发表于 2022-7-28 09:27:43 | 显示全部楼层
回复 2# LJY4.0


    文件夹A下的文件名吗? 没有后缀
发表于 2022-7-28 09:43:18 | 显示全部楼层
本帖最后由 hfxiang 于 2022-7-28 13:10 编辑

@echo off & setlocal
for /f "delims==" %%a in ('set Files_Name_ID[ 2^>nul') do set "%%a="
for /f "usebackq tokens=*"  %%a in ("B文件") do set "Files_Name_ID[%%a]=True"
cd /d "A文件夹"
for %%a  in (*.*) do (
        if defined Files_Name_ID[%%a] move "A文件夹\%%a" "C文件夹"
)
endlocal
 楼主| 发表于 2022-7-28 09:48:59 | 显示全部楼层
回复 3# LJY4.0


    执行了几分钟,有两个问题,
1、命令窗口一直在开着,不知道啥时候结束。
2、文件没有复制到文件夹C下
发表于 2022-7-28 09:56:10 | 显示全部楼层
本帖最后由 LJY4.0 于 2022-7-28 10:04 编辑

回复 6# eleven11
已在3楼修改
速度会快一点,时间花在读取和复制
 楼主| 发表于 2022-7-28 10:01:46 | 显示全部楼层
回复 5# hfxiang


    无效果...
1、桌面新建文件夹,新建files.bat和list.txt两个文件,把命令放入files.bat ,list.txt写入12 13 14 15换行。
2、在F:\tmp 文件夹下 新建12 13文件。
3、把files.bat的B文件改成list.txt,把A文件夹替换成F:\tmp,把C文件夹 替换桌面\新建文件夹。
发表于 2022-7-28 10:09:19 | 显示全部楼层
我兜了一大个圈子才完成
之前是获取所有文件名再判断复制
现在是判断再复制
 楼主| 发表于 2022-7-28 10:10:10 | 显示全部楼层
回复 7# LJY4.0


    @echo off
for /f "delims=" %%a in (C:\Users\Administrator\Desktop\新建文件夹\list.txt) do (
for /f "delims=." %%b in ('dir /s/a-d/b F:\tmp\*') do (
if not exist %%a goto over
if "%%a"=="%%b" copy F:\tmp\%%b C:\Users\Administrator\Desktop\新建文件夹
ver
))
文件分布:
C:\Users\Administrator\Desktop\新建文件夹\list.txt
其中list.txt 内容是
12
13
14

C:\Users\Administrator\Desktop\新建文件夹\files2.bat

F:\tmp\12
F:\tmp\13
F:\tmp\20

最终效果是 C:\Users\Administrator\Desktop\新建文件夹\12
C:\Users\Administrator\Desktop\新建文件夹\13
 楼主| 发表于 2022-7-28 10:12:09 | 显示全部楼层
回复 9# LJY4.0


    我理解应该是笛卡尔积的方式 嵌套for循环。然后比对 比对成功后 移动或复制   我现在测试情况数量较少
发表于 2022-7-28 10:15:19 | 显示全部楼层
回复 11# eleven11
试试新版本

评分

参与人数 1技术 +1 收起 理由
eleven11 + 1 乐于助人

查看全部评分

发表于 2022-7-28 11:53:53 | 显示全部楼层
回复 1# eleven11


目录结构如下:
test.bat
B.txt
A\10万个文件
C\


请参考Q-04和Q-05把bat文件和txt文件都保存为ANSI编码:
https://mp.weixin.qq.com/s/Koje4FufWxWBs7ioDy_LJA
  1. @echo off
  2. cd /d "%~d
  3. for /f "delims=" %%a in ('type "B.txt"') do (
  4.     echo 正在检查字符串 %%a
  5.     if exist "A\%%a" (
  6.         copy /y "A\%%a" "C"
  7.     ) else (
  8.         echo 找不到文件 A\%%a
  9.     )
  10. )
  11. pause
复制代码
发表于 2022-7-28 12:10:45 | 显示全部楼层
试一下findstr的效率...目录可据实值调整
@echo off
set B4w="d:\B\b4w.lst"
set toC="d:\C"
cd/d "d:\A"
dir/b/a-d>"A10w.lst"
findstr /r /g:"%B4w%">"BfromA.lst"
for /f "usebackq delims=" %%F in ("BfromA.lst") do (copy /y "%%~F" %toC%)
del/q "A10w.lst" "BfromA.lst"
exit/b
发表于 2022-7-28 13:16:11 | 显示全部楼层
回复 8# eleven11


经检查是键入错误,把 for /f "usebackq tokens=*"  %%a in ("B文件") do set "Files_Name_ID[%%a]=True"
录入成 for /f "usebackq tokens=*"  %%a in ("B文件") do set "Name_ID[%%a]=True"

也就是说该行的set "Name_ID[%%a]=True"应该为set "Files_Name_ID[%%a]=True",目前5楼已修改,并通过测试。

实测代码如下:
@echo off & setlocal
for /f "delims==" %%a in ('set Files_Name_ID[ 2^>nul') do set "%%a="
for /f "usebackq tokens=*"  %%a in ("d:\Data\temp\B.txt") do set "Files_Name_ID[%%a]=True"
cd /d  "d:\Data\1"
for %%a in (*.*) do (
        if defined Files_Name_ID[%%a] move "d:\Data\1\%%a" "d:\Data\tmp"
)
endlocal

评分

参与人数 1技术 +1 收起 理由
eleven11 + 1 乐于助人

查看全部评分

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

本版积分规则

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

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

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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