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

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

背景:
1、文件夹A 下 有10W个文件(无子文件夹),文件名杂乱无序的字符串(A1~AN);
2、文件B是一个txt文件,里面有4W行,每一行是一个字符串(如A5)。
3、文件夹C
想要达到的效果:
遍历文件夹A,获取其下的10W个文件的文件名,循环比对文件B的行内容,若两者相等,则将A下的文件复制或移动到文件夹C下。(由原来:A\A5 变成 现在的 C\A5)

本帖最后由 LJY4.0 于 2022-7-28 09:21 编辑

请问文件是否有后缀
比如.txt
https://pc.woozooo.com/mydisk.php

TOP

本帖最后由 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. ))
复制代码
https://pc.woozooo.com/mydisk.php

TOP

回复 2# LJY4.0


    文件夹A下的文件名吗? 没有后缀

TOP

本帖最后由 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

TOP

回复 3# LJY4.0


    执行了几分钟,有两个问题,
1、命令窗口一直在开着,不知道啥时候结束。
2、文件没有复制到文件夹C下

TOP

本帖最后由 LJY4.0 于 2022-7-28 10:04 编辑

回复 6# eleven11
已在3楼修改
速度会快一点,时间花在读取和复制
https://pc.woozooo.com/mydisk.php

TOP

回复 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文件夹 替换桌面\新建文件夹。

TOP

我兜了一大个圈子才完成
之前是获取所有文件名再判断复制
现在是判断再复制
https://pc.woozooo.com/mydisk.php

TOP

回复 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

TOP

回复 9# LJY4.0


    我理解应该是笛卡尔积的方式 嵌套for循环。然后比对 比对成功后 移动或复制   我现在测试情况数量较少

TOP

回复 11# eleven11
试试新版本
1

评分人数

https://pc.woozooo.com/mydisk.php

TOP

回复 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
复制代码
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

试一下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

TOP

回复 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

评分人数

TOP

返回列表