Board logo

标题: [文件操作] 求助批处理实现文件查找和剪切 [打印本页]

作者: 001011    时间: 2015-10-17 21:50     标题: 求助批处理实现文件查找和剪切

图片很多,放G盘里面。放时间长了在哪儿都不知道了。想把这些图片做一个汇总。一个个查找剪切太慢。所以求助。
根据TXT里面的图片文件名查找(同一个分区里面)图片,按照规定的文件夹结构剪切到 G:\文件汇总  里面。
如:TXT的某行为:SYWY-WYSYQ-2014-AA0AD9-H-0001-001(这个只是图片文件名的一部分,查找结果可能是:SYWY-WYSYQ-2014-AA0AD9-H-0001-001-10001.jpg或者SYWY-WYSYQ-2014-AA0AD9-H-0001-001-10002.jpg)
txt文本格式:

查找到以后剪切到 G:\文件汇总 里面。
文件夹结构为:

把图片文件放到末级文件夹里面  
如果遇到同名文件,就直接覆盖。
文件很多,可能要考虑执行效率问题
谢谢
作者: WHY    时间: 2015-10-18 01:13

本帖最后由 WHY 于 2015-10-18 02:09 编辑
  1. @if (0)==(0) echo off
  2. set "file=列表.txt"
  3. set "fold=G:\文件汇总"
  4. for /f "tokens=1*delims=|" %%i in ('dir /b /s /a-d *.jpg^|cscript //nologo //e:jscript "%~f0" "%file%"')do (
  5.     md "%fold%\%%i\"
  6.     move "%%j" "%fold%\%%i\%%~nxj"
  7. ) 2>nul
  8. pause & exit
  9. @end
  10. var str = WScript.StdIn.ReadAll();
  11. var fso = new ActiveXObject('Scripting.FileSystemObject');
  12. var txt = fso.OpenTextFile(WScript.Arguments(0)).ReadAll();
  13. txt = txt.replace(/[\^$()\[\]+\-{}.]/g, '\\$&');
  14. var arr, reg = /(.+)\r\n/g, re, ar, s='';
  15. while(arr = reg.exec(txt+'\r\n')){
  16.     re = new RegExp('.*(' + arr[1] + ')[^\\\\]*\\r\\n', 'g');
  17.     while(ar = re.exec(str)){
  18.         s += ar[1].replace(/\-/g, '\\') + '|' + ar[0];
  19.     }
  20. }
  21. WScript.Echo(s)
复制代码

作者: /zhqsystem/zhq    时间: 2015-10-18 01:58

本帖最后由 /zhqsystem/zhq 于 2015-10-18 02:32 编辑

将文本txt直接拖到批处理松手即可
注意:取值路径跟随txt文本路径盘符请提前转换文本中的路径为-(或_)如果是"\"会造成无法正确识别,另外第9行中的判断文本中如果没有后缀请将%%~nxj改为%%~nj.jpg(或"%%~nj"=="%%~ni",此值非常重要)
  1. @echo off
  2. set "drive_path=%~1"
  3. set "drive_drive=%~d1"
  4. echo=%drive_path%
  5. echo=%drive_drive%
  6. setlocal enabledelayedexpansion
  7. for /f "delims=" %%i in ('dir/a-d/s/b/l/on "%drive_drive%\*.jpg"') do (
  8. for /f "delims=" %%j in ('type "%drive_path%"') do (
  9.   if /i "%%~nxi"=="%%~nxj" (
  10.    set "name=%%~nxj"
  11.    set "name=!name:-=\!"
  12.    set "name=!name:_=\!"
  13.    echo !name!
  14.    echo,f|xcopy /y "%%i" "G:\文件汇总\!name!"
  15.   )
  16. )
  17. )
  18. (for /f "delims=" %%i in ('dir/a-d/s/b/l/on "g:\文件汇总\*.jpg"') do echo,"目录树:%%i")>"c:\文件汇总目录树.txt"
  19. echo=此文件路径"c:\文件汇总目录树.txt"
  20. start "" "c:\文件汇总目录树.txt"
  21. pause
复制代码

作者: 001011    时间: 2015-10-18 09:03

非常感谢
二楼的运行无反应
三楼的:txt里面是没有路径的,只有文件名。
作者: WHY    时间: 2015-10-19 19:48

批处理文件保存为:test.bat
txt文件名为:列表.txt
把这两个文件保存在桌面上,双击 test.bat
如果搜索的盘符不是G,或者目标文件夹名称不是G:\文件汇总,自行修改代码中相应的字符串
  1. @if (0)==(0) echo off
  2. for /f "tokens=1*delims=|" %%i in ('dir /b /s G:\*-*.jpg^|cscript //nologo //e:jscript "%~f0"')do (
  3.     md "G:\文件汇总\%%i\"
  4.     move "%%j" "G:\文件汇总\%%i\"
  5. ) 2>nul
  6. pause & exit
  7. @end
  8. var str = WScript.StdIn.ReadAll().replace(/G:\\文件汇总\\.+\.jpg$/igm, '');
  9. var fso = new ActiveXObject('Scripting.FileSystemObject');
  10. var txt = fso.OpenTextFile('列表.txt').ReadAll();
  11. txt = txt.replace(/[\^$()\[\]+\-{}.]/g, '\\$&');
  12. var arr, reg = /(.+)\r\n/g, re, ar, s='';
  13. while(arr = reg.exec(txt+'\r\n')){
  14.     re = new RegExp('.*(' + arr[1] + ')[^\\\\]*\\r\\n', 'ig');
  15.     while(ar = re.exec(str)){
  16.         s += ar[1].replace(/\-/g, '\\') + '|' + ar[0];
  17.     }
  18. }
  19. WScript.Echo(s)
复制代码

作者: 001011    时间: 2015-10-19 22:38

终于OK了  非常感谢
再就是提个要求  能否出一个报告 记录那个没有找到  好做相应处理  
再次感谢
作者: 依山居    时间: 2015-10-22 16:51

everything.exe 是神器啊。不知道在脚本里用起来会不会更爽。
作者: 依山居    时间: 2015-10-22 17:33

楼主可以看一下能不能利用es.exe 优化搜索速度。
作者: 依山居    时间: 2015-10-22 17:38

http://www.bathome.net/viewthrea ... mp;extra=#pid176210




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2