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

[文件操作] 批处理如何根据txt列表搜索文件夹及子文件夹的文件,移动到指定文件夹?

根据txt列表(一行一个文件名)搜索文件夹及子文件夹的文件,移动到指定文件夹,如果没找到这个文件的 记录到日志中,成功的可以不记录,记录也可以
请大大帮助

本帖最后由 tmplinshi 于 2012-11-20 15:55 编辑
  1. @echo off
  2. setlocal
  3. :: ====================
  4. :: 设置
  5. :: ====================
  6. ::
  7. set List_File="file_list.txt"
  8. set Search_Dir="E:\Program Files\Tools\"
  9. set MoveTo_Dir="Found"
  10. set Log_File="NotFound.txt"
  11. :: ====================
  12. :: 生成查找文件的批处理
  13. :: ====================
  14. ::
  15. (
  16.     set /p = @dir /s /b
  17.     for /f "eol=< usebackq delims=" %%a in (%List_File%) do set /p = "%%a"
  18. ) <nul >"%temp%\_dir.bat"
  19. :: ====================
  20. :: 搜索文件;移动文件;记录已找到的文件
  21. :: ====================
  22. ::
  23. if not exist %MoveTo_Dir% md %MoveTo_Dir%
  24. for %%a in (%MoveTo_Dir%) do set MoveTo_Dir="%%~fa"
  25. pushd %Search_Dir%
  26. (
  27.     echo 正在搜索... >con
  28.     for /f "eol=< delims=" %%a in (' "%temp%\_dir.bat" ') do (
  29.         echo %%~nxa
  30.         echo 正在移动 "%%a"... >con
  31.         move "%%a" %MoveTo_Dir%
  32.     )
  33. ) >"%temp%\.found.tmp"
  34. :: ====================
  35. :: 将未找到的文件记录到 %Log_File% 中
  36. :: ====================
  37. ::
  38. popd
  39. type "%temp%\.found.tmp" %List_File% 2>nul | sort >"%temp%\.sort.tmp"
  40. (
  41.     set count=0
  42.     for /f "eol=< usebackq delims=" %%a in ("%temp%\.sort.tmp") do (
  43.         set str=%%a
  44.         setlocal enabledelayedexpansion
  45.         if /i "!str!" neq "!last!" (
  46.             if !count! == 1 echo,!last!
  47.             EndLocal
  48.             set last=%%a
  49.             set count=1
  50.         ) else (
  51.             EndLocal
  52.             set /a count += 1
  53.         )
  54.     )
  55. ) >%Log_File%
  56. setlocal enabledelayedexpansion
  57. if %count% == 1 echo !last!>>!Log_File!
  58. EndLocal
  59. for %%a in (%Log_File%) do (
  60.     if %%~za neq 0 (
  61.         echo,
  62.         echo 未找到的文件已记录到 %Log_File% 中,内容如下:
  63.         type %Log_File%
  64.     )
  65. )
  66. :: ====================
  67. :: 退出
  68. :: ====================
  69. ::
  70. del "%temp%\_dir.bat" "%temp%\.found.tmp" "%temp%\.sort.tmp"
  71. echo,
  72. echo 完成!按任意键退出...
  73. pause >nul
复制代码

TOP

感谢版主的热心帮助,但是还没有运行成功,全部都没有找到,
我用这个可以实现移动,但不知道怎么记录没有找到的

@echo off
title  文件移动工具
for /f %%a in (.\a.txt) do for /r %%i in (%%a) do if exist "%%i" Move "%%i" "J:\a\
pause

TOP

本帖最后由 tmplinshi 于 2012-11-20 16:17 编辑

回复 3# 下一页


   
:: ====================
:: 设置
:: ====================
::
set List_File="file_list.txt"
set Search_Dir="E:\Program Files\Tools\"
set MoveTo_Dir="Found"
set Log_File="NotFound.txt"


有没有修改这部分的代码?另外,你的 txt 列表有多少行?

TOP

本帖最后由 下一页 于 2012-11-20 16:33 编辑

set Search_Dir="E:\Program Files\Tools\"
改了的,改成了文件所在的目录了,且BAT也在这个目录里
有844行,且为中文文件名

黄帝内经_张三2010.pdf
黄帝_贺娟2009.pdf

这样的

TOP

本帖最后由 tmplinshi 于 2012-11-20 16:59 编辑

是因为 txt 列表的行数太多了。只能换一种方法了。

TOP

那能不能就我上传这个代码修改一下呢,
1、扩展为能查找子目录
2、增加没找到的文件的记录

TOP

那能不能就我上传这个代码修改一下呢,
1、扩展为能查找子目录
2、增加没找到的文件的记录
下一页 发表于 2012-11-20 17:04
  1. @echo off
  2. title  文件移动工具
  3. (for /f %%a in (.\a.txt) do (
  4.     set .found=
  5.     for /r %%i in ("%%a?") do (
  6.         if /i "%%~nxi" == "%%a" (
  7.             Move "%%i" "J:\a\"
  8.             set .found=#
  9.         )
  10.     )
  11.     if not defined .found echo %%a
  12. )) >NotFound.txt
  13. pause
复制代码

TOP

  1. @echo off
  2. title  文件移动工具
  3. if not exist Found md Found
  4. (for /f "delims=" %%a in (.\a.txt) do (
  5.     set .found=
  6.     for /r %%i in ("%%a?") do (
  7.         if /i "%%~nxi" == "%%a" (
  8.             Move "%%i" "Found"
  9.             set .found=#
  10.         )
  11.     )
  12.     if not defined .found echo %%a
  13. )) >NotFound.txt
  14. pause
复制代码
增加了一个 "delims=" 可以适就 文件名中有空格了,很好用了,感谢 tmplinshi 的帮助,7000多个文件已经移动完成

TOP

返回列表