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

[文件操作] [已解决]批量搜索并移动文件

本帖最后由 lxh623 于 2011-11-13 15:04 编辑

首先,D:/pdf文件夹含有如下pdf(目录文件列表1.txt):

JP9316337-=6090879-DCT
JP9316331-=5788884-SE
JP9314875-=6004658-SE
JP9310094-=6239098-SE
JP9310025-=5744508-SE
JP9268281-=5853896-DCT
JP9268256-=5705587-DCT
JP9208828-=5824729-DCT
JP9176490-=5936033-SE
JP63202658-=EP0350519-DCT
JP63193958-=EP0278731-SE      

E盘可能有文件名包括6090879等的文件。
我想,用等号后面的,比如“6090879”(等号=以后、-DCT/-SE/-GET/-WKA以前的字符),去搜索E盘。如果有,就把“JP9316337-=6090879-DCT”移动到E盘“6090879”所在同级目录;JP9316331-=5788884-SE.pdf移动到5788884所在地方……
拜托!谢谢!

[ 本帖最后由 lxh623 于 2008-11-24 21:08 编辑 ]
1

评分人数

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

避免 findstr 进入循环的方案:
  1. @echo off
  2. for /f "delims=" %%a in (1.txt) do (
  3. for /f "tokens=2 delims==-" %%b in ("%%a") do (
  4. echo %%b %%a>>2.txt
  5. echo %%b>>3.txt
  6. )
  7. )
  8. dir /s /b e:\*.pdf>4.txt
  9. for /f "delims=" %%a in ('findstr /eg:2.txt 4.txt') do (
  10. set str=%%~na
  11. setlocal enabledelayedexpansion
  12. for /f "tokens=1*" %%b in (3.txt) do (
  13. if "!file:%%b=!" neq "!file!" move "d:\pdf\%%c.pdf" "%%~dpa"
  14. )
  15. )
  16. pause
复制代码

TOP

  嘿嘿,for用习惯了,容易造成思维定势,连dir列文件路径的时候都忍不住要for一把,还是terse直接dir更有效率。
尺有所短寸有所长,学好批处理没商量;
考虑问题复杂化,解决问题简洁化。

心在天山,身老沧州。

TOP

真诚感谢三位大侠!我一个外行,蒙您们热心帮助,再次谢谢!

TOP

原帖由 随风 于 2008-11-25 18:29 发表
汗,粗心大意,多谢提醒!
但此题应该还有更高效的代码,terse 兄是否发来看看。。

也没思路  我看随风兄的可以少个for如何
  1. @echo off
  2. for /f "delims=" %%i in ('dir/b/s/ad e:\') do (
  3.       for /f "tokens=2 delims==-" %%j in (a.txt) do (
  4.          if exist "%%i\*%%j*.pdf" echo move "d:\pdf\*%%j*.pdf" "%%i" 2>nul
  5. ))
  6. pause
复制代码
楼主如果每个文件仅处理一次 这样的临时文件效率是否。。
  1. @echo off
  2. dir /b /a-d /s "e:\*.pdf">pdf.txt
  3. echo.>>pdf.txt
  4. for /f "tokens=2 delims=-=" %%i in (a.txt) do (
  5.    for /f "delims=" %%j in ('findstr /ic:%%i "pdf.txt" 2^>nul') do (
  6.      if not defined %%i echo move "d:\pdf\*%%~ni*.pdf" "%%~dpj" 2>nul&set %%i=a
  7. ))
  8. del pdf.txt
  9. pause
复制代码
1

评分人数

    • CrLf: 乐于助人技术 + 1

TOP

回复 12楼 的帖子

汗,粗心大意,多谢提醒!
但此题应该还有更高效的代码,terse 兄是否发来看看。。

[ 本帖最后由 随风 于 2008-11-25 18:30 编辑 ]
技术问题请到论坛发帖求助!

TOP

RE terse:

  /iec:"%%j.pdf"   不能用  /ic:"%%j",因为必须保证.pdf出现在路径的末尾,若有 e:\test.pdf.txt 之类的路径就不是楼主所想要的了。
尺有所短寸有所长,学好批处理没商量;
考虑问题复杂化,解决问题简洁化。

心在天山,身老沧州。

TOP

RE:  namejm管理兄
按楼主的意思这里的 /iec:"%%j.pdf"   可否用  /ic:"%%j" 呢?
RE:   随风兄
呵呵  又是笔误   for /f "delimd="

TOP

原帖由 lxh623 于 2008-11-25 08:15 发表
我用一个pdf做实验。
把 echo 把 d:/pdf/%%i.pdf 移动到 "%%~dpk"  替换为 move d:/pdf/%%i.pdf "%%~dpk"
说“语法错误”。
把 把 d:/pdf/%%i.pdf 移动到 "%%~dpk"  替换为 move d:/pdf/%%i.pdf "%%~dpk"
没有 ...

  不好意思,本机路径中应该是反斜杠而不是斜杠,是我把路径写错了,d:/pdf/%%i.pdf 应该是 d:\pdf\%%i.pdf ,请再次测试。
尺有所短寸有所长,学好批处理没商量;
考虑问题复杂化,解决问题简洁化。

心在天山,身老沧州。

TOP

如果1.txt 文件不是很大的话,可以这样,效率应该会高点。
显示正确后去掉  echo 即可。
未测试。。。
:
  1. @echo off
  2. for /f "delims=" %%i in ('dir/b/s/ad e:\') do (
  3.    for /f "delims=" %%a in (1.txt) do (
  4.       for /f "tokens=2 delims==-" %%b in ("%%a") do (
  5.          if exist "%%i\*%%b*.pdf" echo move "d:/pdf/%%a.pdf" "%%i" 2>nul
  6. )))
  7. pause
复制代码

[ 本帖最后由 随风 于 2008-11-25 18:28 编辑 ]
1

评分人数

    • CrLf: 乐于助人技术 + 1
技术问题请到论坛发帖求助!

TOP

我用一个pdf做实验。
echo 把 d:/pdf/%%i.pdf 移动到 "%%~dpk"  替换为 move d:/pdf/%%i.pdf "%%~dpk"
说“语法错误”。
把 d:/pdf/%%i.pdf 移动到 "%%~dpk"  替换为 move d:/pdf/%%i.pdf "%%~dpk"
没有移动。

1.txt和list.txt都用%%i?。我是外行,不太懂。请大侠帮助修改!

[ 本帖最后由 lxh623 于 2008-11-25 09:03 编辑 ]

TOP

  只要不包含&和!就可以。

  假设E盘所有路径中,.pdf只是后缀名,而不可能出现在文件夹名和文件名中,那么,把如下代码放在与1.txt相同的路径下运行即可。

  考虑到效率问题,生成了临时文件list.txt,请自行删除;若屏幕提示的内容与你的预期吻合,请把 echo 把 d:/pdf/%%i.pdf 移动到 "%%~dpk"  替换为 move d:/pdf/%%i.pdf "%%~dpk" (代码未经测试,请先测试后再修改):
  1. @echo off
  2. echo 全盘扫描E盘下的pdf文件,请耐心等待...
  3. cd.>list.txt
  4. for /f "delims=" %%i in ('dir /a-d /b /s e:\*.pdf 2^>nul') do (echo %%i)>>list.txt
  5. echo.>>list.txt
  6. cls
  7. for /f "delims=" %%i in (1.txt) do (
  8.     for /f "tokens=2 delims==-" %%j in ("%%i") do (
  9.         for /f "delims=" %%k in ('findstr /iec:"%%j.pdf" list.txt 2^>nul') do (
  10.             echo 把 d:/pdf/%%i.pdf 移动到 "%%~dpk"
  11.         )
  12.     )
  13. )
  14. pause
复制代码


————————————————————————————————————
d:/pdf/%%i.pdf 应为 d:\pdf\%%i.pdf ,本机路径用反斜杠而非斜杠,特此更正。
                         ——namejm 2008.11.25
1

评分人数

    • CrLf: 乐于助人技术 + 1
尺有所短寸有所长,学好批处理没商量;
考虑问题复杂化,解决问题简洁化。

心在天山,身老沧州。

TOP

原帖由 namejm 于 2008-11-24 22:25 发表
  是必须在pdf文件名中包含还是所有类型的文件名中包含都算?

  另:E盘的路径中是否包含有特殊字符?如&、!。

pdf!
可能有“品种-■阻燃”等,▲、◆、★、▲▲等字符。这个会有影响吗?

TOP

  是必须在pdf文件名中包含还是所有类型的文件名中包含都算?

  另:E盘的路径中是否包含有特殊字符?如&、!。
尺有所短寸有所长,学好批处理没商量;
考虑问题复杂化,解决问题简洁化。

心在天山,身老沧州。

TOP

原帖由 namejm 于 2008-11-24 22:04 发表
  疑问1:“D:/pdf文件夹含有如下pdf(目录文件列表1.txt)”,下面列举的究竟是文件名还是文件夹名?你所说的“目录文件”四字让人疑窦重重;
  疑问2:“E盘可能有文件名包括6090879等的文件”,这个6090879是指 ...

1、pdf文件
2、包含
3、可能没有,可能多个,移动到任意一个都行!

TOP

返回列表