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

[文件操作] [已解决] 批处理怎样根据文本内容查找对应图片路径?

a.txt内容:
d-d
d-e
d-f

D:/images/picture/文件夹包含(图片文件名均为以下形式)
D:/images/picture/d-d.jpg
D:/images/picture/a/d-d_01.jpg
D:/images/picture/b/d-d_02.jpg
D:/images/picture/c/e/d-f.jpg
D:/images/picture/g/d/d-f_01.jpg
D:/images/picture/h/e/d-f_02.jpg
D:/images/picture/i/d-f_03.jpg

求此批处理 ,查找图片名含a.txt文本里每一行字符串的图片,多张图片的话用逗号隔开,  得到b.txt文件内容

2011-01-14 问题更新: 仅查找图片名带下划线 " _ " 的图片.不带 " _ " 的不要列出来

b.txt(格式为:  每行开始为a.txt内容, 逗号后面为寻找的文件包括路径,找不到该文件标注找不到)
d-d,a/d-d_01.jpg,b/d-d_02.jpg
d-e,找不到该文件
d-f,g/d/d-f_01.jpg,h/e/d-f_02.jpg,i/d-f_03.jpg

需要考虑效率问题, 图片可能有几千到几万张


[ 本帖最后由 daohe 于 2011-1-14 20:23 编辑 ]
1

评分人数

    • Batcher: 感谢给帖子标题标注[已解决]字样PB + 2

  1. @echo off
  2. for /f %%i in (a.txt) do (for /r e:/images/picture %%a in (%%i**.jpg) do echo %%i %%a>>b.txt)
  3. pause
复制代码

TOP

  1. @echo off&setlocal enabledelayedexpansion
  2. set "r=D:/images/picture"
  3. :r
  4. if not "!r:~%n%,1!"=="" (
  5. set/a n+=1
  6. goto:r
  7. )
  8. set/a n+=1
  9. (for /r "%r%" %%a in (*.jpg) do (
  10. set a=%%a
  11. echo !a:~%n%!
  12. ))>b.txt
  13. (for /f "delims=" %%a in (a.txt) do (
  14. echo %%a,
  15. findstr /i /c:"%%a" b.txt||echo 找不到该文件
  16. ))>temp
  17. (for /f "delims=" %%a in (temp) do (
  18. set a=%%a
  19. if "!a:~-1!"=="," (
  20. if defined b echo/
  21. set/p"=%%a"<nul
  22. ) else (
  23. set/p"=%%a,"<nul
  24. )
  25. set b==
  26. ))>b.txt
  27. del temp
复制代码
寒夜孤星:在没有说明的情况下,本人所有代码均运行在 XP SP3 下 (有问题请发贴,QQ临时会话已关闭)

TOP

感谢二楼, 可以列出文件地址,但是得不到我需要的b.txt文本格式.
原帖由 hucuibai 于 2011-1-12 17:17 发表
@echo off
for /f %%i in (a.txt) do (for /r e:/images/picture %%a in (%%i**.jpg) do echo %%i %%a>>b.txt)
pause

TOP

感谢 寒夜孤星

你的代码是可以的.非常棒.太感谢了.
但是我的需求漏了一点,

仅查找图片名带下划线 " _ " 的图片.不带 " _ " 的不要列出来

原帖由 hanyeguxing 于 2011-1-12 17:24 发表
@echo off&setlocal enabledelayedexpansion
set "r=D:/images/picture"
:r
if not "!r:~%n%,1!"=="" (
        set/a n+=1
        goto:r
)
set/a n+=1
(for /r "%r%" %%a in (*.jpg) do (
        set a=%%a
        echo !a:~%n%!
...

[ 本帖最后由 daohe 于 2011-1-14 16:13 编辑 ]

TOP

  1. @echo off&setlocal enabledelayedexpansion
  2. set "r=D:\images\picture\"
  3. (for /f "delims=" %%a in ('dir /b/s/a-d "%r%*.jpg"') do (
  4.         set a=%%~na&set b=%%a
  5.         set a=!a:_=!
  6.         if not "!a!"=="%%~na" echo !b:%r%=!
  7. ))>b.txt
  8. (for /f "delims=" %%a in (a.txt) do (
  9.         echo %%a,
  10.         findstr /i /c:"%%a" b.txt||echo 找不到该文件
  11. ))>temp
  12. (for /f "delims=" %%a in (temp) do (
  13.         set a=%%a
  14.         if "!a:~-1!"=="," (
  15.                 set d=
  16.                 if defined c echo/
  17.                 if defined d set/p"=,"<nul
  18.                 ) else (
  19.                 set d==
  20.                 )
  21.         set/p"=%%a"<nul
  22.         set c==
  23. ))>b.txt
  24. del temp
复制代码

[ 本帖最后由 hanyeguxing 于 2011-1-14 20:11 编辑 ]
1

评分人数

寒夜孤星:在没有说明的情况下,本人所有代码均运行在 XP SP3 下 (有问题请发贴,QQ临时会话已关闭)

TOP

  1. @echo off
  2. (for /f "delims=" %%a in ('dir/b/s "D:\images\picture\*.jpg"^|findstr /i "_"') do (
  3.    echo %%a
  4. ))>tem
  5. findstr /ig:a.txt tem>tem.txt
  6. start "" "tem.txt"
  7. del /q tem
复制代码
技术问题请到论坛发帖求助!

TOP

真不好意思, 本批处理出不来结果.

原帖由 hanyeguxing 于 2011-1-14 16:47 发表
@echo off&setlocal enabledelayedexpansion
set "r=D:\images\picture\"
(for /f "delims=" %%a in ('dir /b/s/a-d "%r%*.jpg"^|find "_"') do (
        set a=%%a
        echo !a:%r%=!
)))>b.txt
(for /f ...

TOP

真不好意思,本帖出来的结果不是很符合b.txt的格式要求
原帖由 随风 于 2011-1-14 16:56 发表
@echo off
(for /f "delims=" %%a in ('dir/b/s "D:\images\picture\*.jpg"^|findstr /i "_"') do (
   echo %%a
))>tem
findstr /ig:a.txt tem>tem.txt
start "" "tem.txt"
del /q tem

TOP

回复 8楼 的帖子

第一个 for 里多打了一个 )
已经修改

[ 本帖最后由 hanyeguxing 于 2011-1-14 20:09 编辑 ]
寒夜孤星:在没有说明的情况下,本人所有代码均运行在 XP SP3 下 (有问题请发贴,QQ临时会话已关闭)

TOP

如果文件数量太多,不建议用findstr
  1. @echo off&setlocal enabledelayedexpansion
  2. set "PicPath=D:\images\picture"
  3. for /f "delims=" %%i in (a.txt) do (
  4.   set line=
  5.   for /f "delims=" %%j in ('dir /b/s %PicPath%\*%%i_*.jpg 2^>nul') do (
  6.     set "tmp=%%~fj"
  7. set "tmp=!tmp:%PicPath%=!"
  8. set "line=!line!,!tmp!"
  9.   )
  10.   if defined line (>>b.txt echo %%i!line!) else (>>b.txt echo %%i,找不到该文件)
  11. )
  12. pause
复制代码
1

评分人数

TOP

回复 10楼 的帖子

感谢 寒夜孤星的杰作!

TOP

回复 11楼 的帖子

感谢 Broly 的杰作.

TOP

返回列表