标题: [文件操作] 【已解决】批处理如何实现特定文件名文件的复制和归档? [打印本页]
作者: gxx2002 时间: 2015-2-28 00:10 标题: 【已解决】批处理如何实现特定文件名文件的复制和归档?
本帖最后由 gxx2002 于 2015-3-2 16:48 编辑
问题:我在文本文档中有一个文件名列表,想要从一个文件夹(其中包含了所需文件以及多余的文件)中根据列表提取出这些文件。有没有软件可以做到以上要求的批量搜索?由于文件名数上百,不可能用windows自带搜索来搜,也不能用文件名加逗号“,”法(因为列表实在太长,难以一个一个写逗号)。
解答:这种情况用批处理简单些,假定你的那个文件名列表是file.txt,你的文件夹是d盘的sample,要把这个file.txt中有的在sample下存在的的文件复制到d盘的new文件夹,打开记事本贴入以下内容:- @for /f %%i in (file.txt) do if exist "d:\sample\%%i" copy "d:\sample\%%i" d:\new
复制代码
保存为bat文件(也就是文件类型选择所有文件,文件名随便填比如ss.bat)
把这个ss.bat跟你的file.txt放在一个目录下,双击运行这个bat就行了。
需要改进的地方:对于这个公式,还需要3个功能:
1. 需要搜索的文件夹中,包含子文件夹;有些子文件夹在目前额命令中是不支持的。
2. 在上面的“file.TXT”文件中,如果输入的是部分文件名(如文件名中间的几个字符),那么就搜索不到了。
3. 还需要一个功能,能否限定只在某个修改日期段范围内的文件搜索?超出这个日期段的,就不搜了
如何改进?
作者: CrLf 时间: 2015-2-28 01:30
- @for /f %%i in ('dir /s /a-d /b^|findstr /l /g:file.txt') do (
- if %%~ta gtr 2015/01/01 if %%~ta lss 2015/02/01 copy "d:\sample\%%i" d:\new
- )
复制代码
作者: gxx2002 时间: 2015-2-28 09:31
回复 2# CrLf
大神,我修改了一下,还是不行!
大神是否有QQ,能否帮忙?!
感激不尽!
作者: gxx2002 时间: 2015-2-28 09:47
回复 2# CrLf
实际处理结果还是不行,我用的是win7的,不知道是系统问题,还是我修改的不对,烦请大神帮忙!
作者: gxx2002 时间: 2015-2-28 10:05
另外,如果子目录下还有子目录,这个程序能否支持?
作者: gxx2002 时间: 2015-2-28 10:25
我把我需要做的东西放到附件中了,烦请大神帮忙!
作者: pcl_test 时间: 2015-2-28 12:08
回复 1# gxx2002
假设file.txt为列出需复制的文件列表的文本文档,那么里面的内容格式是怎样的?
作者: gxx2002 时间: 2015-2-28 13:42
回复 7# pcl_test
file.txt文件中的内容:仅仅是文件名的部分,但是是多个部分的集合。
比如,里面把人的姓氏写上,后面待处理文件里面,文件名是以人的全名来命名。只要把姓名中含有这个姓氏的文件提出来归档就好。
作者: gxx2002 时间: 2015-2-28 13:45
回复 7# pcl_test
你可以下载我刚才发的RAR文件,里面就有实例,您能否帮忙操作?
真的非常感谢!
作者: pcl_test 时间: 2015-2-28 13:52
本帖最后由 pcl_test 于 2015-2-28 14:02 编辑
回复 9# gxx2002
限定只在某个修改日期段范围内的文件搜索?提供以下三种种方式,请选择
1、筛选出修改日期为N天前至当前日期以内的文件
2、筛选出修改日期为N天前的文件
3、输入修改日期1和修改日期2,筛选出修改日期1和修改日期2之间的文件
作者: gxx2002 时间: 2015-2-28 13:59
回复 10# pcl_test
可以采用输入日期的方式,这样更好,更灵活!
作者: gxx2002 时间: 2015-2-28 14:00
回复 10# pcl_test
大神有没有QQ?非常希望可以向你请教!
作者: bailong360 时间: 2015-2-28 14:20
本帖最后由 bailong360 于 2015-2-28 15:02 编辑
- @Echo Off
- Set /P Min=Min(YYYYMMDD):&Set /P Max=Max(YYYYMMDD):
- For /F "Delims=" %%i In (文件名.txt) Do >nul Robocopy .\原文件夹 .\目标文件夹 *%%i*.* /S /MaxLad:%Min% /MinLad:%Max%
- Set/P=完成!
复制代码
这样是否符合要求?
已修正,刚把max和min填反了
Win 8.1 32位
Min:20140101
Max:20160110
测试通过
作者: gxx2002 时间: 2015-2-28 14:59
回复 13# bailong360
我试了,不行!没有一个文件被拷贝出来。
我的文件名.TXT内不是存的全名或者路径+全名,而是全名的一个部分。
您看能否帮忙下载一下我上传的文件?直接在里面编辑?多谢!
作者: pcl_test 时间: 2015-2-28 15:08
回复 11# gxx2002
批处理跟file.txt放在一起运行- @echo off
- setlocal enabledelayedexpansion
- ::设定要搜索的目录
- set "fdir1=D:\test\"
- ::设定目标文件夹
- set "fdir2=D:\new\"
- ::设定修改日期1(yyyymmdd)
- set date1=20150102
- ::设定修改日期2(yyyymmdd)
- set date2=20150225
- ::日期1要早于日期2
- if %date1% geq %date2% echo 日期1要早于日期2,请重新设定 & pause & exit
- for /f "delims=" %%a in ('type "file.txt"') do (
- if not exist "%fdir2%%%a\" md "%fdir2%%%a\"
- for /f "delims=" %%b in ('dir /a-d /s /b "%fdir1%" ^|findstr /c:"%%a"') do (
- for /f "tokens=1*" %%c in ('dir /tw "%%b" ^|findstr ":"') do (
- set "wdate=%%c"
- set "wdate=!wdate:~0,4!!wdate:~5,2!!wdate:~8,2!"
- if !wdate! geq %date1% if !wdate! leq %date2% (
- echo "%%b"
- copy "%%b" "%fdir2%%%a\" /y)
- )
- )
- )
- pause
复制代码
作者: gxx2002 时间: 2015-2-28 16:15
回复 16# pcl_test
感谢您的代码!感觉很接近了!
我的 file.txt文件里面都是数字,数字之间是用回车间隔,并且我要找的文件也都是文件名带数字的。我需要找跟这些数字相关联的但是遇到新的问题:
1. 会在“D:/NEW”下生成不少新的文件夹,文件夹名称的最后一个字段是数字。我的file.txt里面有2、3、4、7这4个数字,然后D:/NEW下也就有了4个文件夹,文件夹名称就分别是2、3、4、7。很奇怪!我希望是都保存在一个文件中的,这样又新增了新的文件夹了。
2. 会在"D:/NEW"中的2文件夹中,把原文件夹中所有的项目都拷贝进来了,不管是不是FILE.TXT里面需要的,都统统考进来了。
大神请帮忙!
作者: pcl_test 时间: 2015-2-28 16:28
回复 17# gxx2002
把14行、21行代码中的"%fdir2%%%a\"改为"%fdir2%"
作者: gxx2002 时间: 2015-2-28 17:01
回复 18# pcl_test
还是有个问题,他把所有的文件都拷出来了!不仅是在file.txt里面的文件,而现在只是需要file.txt文件中规定的几个文件!
烦请大神您帮忙!也麻烦大神直接在我附上的RAR文件中修改吧?多谢啊!
多谢!
作者: pcl_test 时间: 2015-2-28 17:16
回复 19# gxx2002
用你给的例子直接运行代码没有问题呀,只是需要file.txt文件中规定的几个文件?不是说file.txt列出的只是文件的部分名字吗?所以只要名字包含有file.txt列出的的都会复制过去,而且修改时间要设定好
作者: gxx2002 时间: 2015-2-28 17:19 标题: 标题
回复 20# pcl_test
大神,我用的是win7 64bit是否是这个问题?
作者: pcl_test 时间: 2015-2-28 17:25
回复 21# gxx2002
是不是你的一些子文件夹名也包含有file.txt列出的某些字符串?
作者: caruko 时间: 2015-2-28 18:02
1、可能效率略慢;
2、先在CMD中输入echo,%date% 确定日期的格式,然后根据日期格式填下 geq(大于等于) leq(小于等于) 后面的日期。 如果是date输出的2014/01/01 这样,就要填一样的格式。
代码如下:
for /f %%s in (file.txt) do for /r "原文件夹" %%f in (*%%s*.txt) do if "%%~tf" geq "2014-01-01" if "%%~tf" leq "2014-04-31" copy "%%~dpnxf" "\目标文件夹\%%~nxf" /Y
作者: pcl_test 时间: 2015-2-28 18:33
本帖最后由 pcl_test 于 2015-2-28 18:34 编辑
回复 19# gxx2002
过滤了子文件夹名也包含有file.txt列出的某些字符串导致不符合要求的文件也被复制的问题- @echo off
- setlocal enabledelayedexpansion
- ::设定要搜索的目录
- set "fdir1=原文件夹\"
- ::设定目标文件夹
- set "fdir2=目标文件夹\"
- ::设定修改日期1(yyyymmdd)
- set date1=20150101
- ::设定修改日期2(yyyymmdd)
- set date2=20150228
- ::日期1要早于日期2
- if %date1% geq %date2% echo 日期1要早于日期2,请重新设定 & pause & exit
- if not exist "%fdir2%" md "%fdir2%"
- for /f "delims=" %%a in ('dir /a-d /s /b "%fdir1%"') do >>$1 echo,%%~nxa
- for /f "delims=" %%b in ('type "文件名.txt"') do >>$2 findstr /c:"%%b" $1
- for /f "delims=" %%c in ('type $2') do (
- for /r "%fdir1%" %%e in (.) do (
- set "tdir=%%e"
- if exist "!tdir:~0,-1!%%c" >>$3 echo,!tdir:~0,-1!%%c
- )
- )
- for /f "delims=" %%i in ('type $3') do (
- set "wdate=%%~ti"
- set "wdate=!wdate:~0,4!!wdate:~5,2!!wdate:~8,2!"
- if !wdate! geq %date1% if !wdate! leq %date2% (
- echo "%%i" 最后修改日期为!wdate!
- copy "%%i" "%fdir2%" /y
- )
- )
- del $* /f /q
- pause
复制代码
作者: pcl_test 时间: 2015-3-2 11:59
回复 19# gxx2002
问题得到解决请在标题最前面注明[已解决]
http://www.bathome.net/thread-3473-1-1.html
作者: gxx2002 时间: 2015-3-2 16:43
真的多谢大神!
作者: gxx2002 时间: 2015-3-2 16:45
回复 25# pcl_test
多谢大神!非常感谢!已经解决了!
作者: gxx2002 时间: 2015-3-2 16:48
回复 24# pcl_test
用了您的办法,解决了!
感谢!
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |