标题: [文件操作] 批处理如何根据txt列表搜索文件夹及子文件夹的文件,移动到指定文件夹? [打印本页]
作者: 下一页 时间: 2012-11-20 01:03 标题: 批处理如何根据txt列表搜索文件夹及子文件夹的文件,移动到指定文件夹?
根据txt列表(一行一个文件名)搜索文件夹及子文件夹的文件,移动到指定文件夹,如果没找到这个文件的 记录到日志中,成功的可以不记录,记录也可以
请大大帮助
作者: tmplinshi 时间: 2012-11-20 15:38
本帖最后由 tmplinshi 于 2012-11-20 15:55 编辑
- @echo off
- setlocal
-
- :: ====================
- :: 设置
- :: ====================
- ::
- set List_File="file_list.txt"
- set Search_Dir="E:\Program Files\Tools\"
- set MoveTo_Dir="Found"
- set Log_File="NotFound.txt"
-
- :: ====================
- :: 生成查找文件的批处理
- :: ====================
- ::
- (
- set /p = @dir /s /b
- for /f "eol=< usebackq delims=" %%a in (%List_File%) do set /p = "%%a"
- ) <nul >"%temp%\_dir.bat"
-
- :: ====================
- :: 搜索文件;移动文件;记录已找到的文件
- :: ====================
- ::
- if not exist %MoveTo_Dir% md %MoveTo_Dir%
- for %%a in (%MoveTo_Dir%) do set MoveTo_Dir="%%~fa"
- pushd %Search_Dir%
-
- (
- echo 正在搜索... >con
- for /f "eol=< delims=" %%a in (' "%temp%\_dir.bat" ') do (
- echo %%~nxa
- echo 正在移动 "%%a"... >con
- move "%%a" %MoveTo_Dir%
- )
- ) >"%temp%\.found.tmp"
-
- :: ====================
- :: 将未找到的文件记录到 %Log_File% 中
- :: ====================
- ::
- popd
- type "%temp%\.found.tmp" %List_File% 2>nul | sort >"%temp%\.sort.tmp"
-
- (
- set count=0
- for /f "eol=< usebackq delims=" %%a in ("%temp%\.sort.tmp") do (
- set str=%%a
- setlocal enabledelayedexpansion
- if /i "!str!" neq "!last!" (
- if !count! == 1 echo,!last!
- EndLocal
- set last=%%a
- set count=1
- ) else (
- EndLocal
- set /a count += 1
- )
- )
- ) >%Log_File%
-
- setlocal enabledelayedexpansion
- if %count% == 1 echo !last!>>!Log_File!
- EndLocal
-
- for %%a in (%Log_File%) do (
- if %%~za neq 0 (
- echo,
- echo 未找到的文件已记录到 %Log_File% 中,内容如下:
- type %Log_File%
- )
- )
-
- :: ====================
- :: 退出
- :: ====================
- ::
- del "%temp%\_dir.bat" "%temp%\.found.tmp" "%temp%\.sort.tmp"
- echo,
- echo 完成!按任意键退出...
- pause >nul
复制代码
作者: 下一页 时间: 2012-11-20 16:12
感谢版主的热心帮助,但是还没有运行成功,全部都没有找到,
我用这个可以实现移动,但不知道怎么记录没有找到的
@echo off
title 文件移动工具
for /f %%a in (.\a.txt) do for /r %%i in (%%a) do if exist "%%i" Move "%%i" "J:\a\
pause
作者: tmplinshi 时间: 2012-11-20 16:15
本帖最后由 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 列表有多少行?
作者: 下一页 时间: 2012-11-20 16:31
本帖最后由 下一页 于 2012-11-20 16:33 编辑
set Search_Dir="E:\Program Files\Tools\"
改了的,改成了文件所在的目录了,且BAT也在这个目录里
有844行,且为中文文件名
黄帝内经_张三2010.pdf
黄帝_贺娟2009.pdf
这样的
作者: tmplinshi 时间: 2012-11-20 16:46
本帖最后由 tmplinshi 于 2012-11-20 16:59 编辑
是因为 txt 列表的行数太多了。只能换一种方法了。
作者: 下一页 时间: 2012-11-20 17:04
那能不能就我上传这个代码修改一下呢,
1、扩展为能查找子目录
2、增加没找到的文件的记录
作者: tmplinshi 时间: 2012-11-20 17:41
那能不能就我上传这个代码修改一下呢,
1、扩展为能查找子目录
2、增加没找到的文件的记录
下一页 发表于 2012-11-20 17:04
- @echo off
- title 文件移动工具
- (for /f %%a in (.\a.txt) do (
- set .found=
- for /r %%i in ("%%a?") do (
- if /i "%%~nxi" == "%%a" (
- Move "%%i" "J:\a\"
- set .found=#
- )
- )
- if not defined .found echo %%a
- )) >NotFound.txt
- pause
复制代码
作者: 下一页 时间: 2012-11-21 00:57
- @echo off
- title 文件移动工具
-
- if not exist Found md Found
- (for /f "delims=" %%a in (.\a.txt) do (
- set .found=
- for /r %%i in ("%%a?") do (
- if /i "%%~nxi" == "%%a" (
- Move "%%i" "Found"
- set .found=#
- )
- )
- if not defined .found echo %%a
- )) >NotFound.txt
- pause
复制代码
增加了一个 "delims=" 可以适就 文件名中有空格了,很好用了,感谢 tmplinshi 的帮助,7000多个文件已经移动完成
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |